ents whose descendants should be filled in.
* @return array
*/
protected function fill_descendants( $comments ) {
$levels = array(
0 => wp_list_pluck( $comments, 'comment_ID' ),
);
$key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) );
$last_changed = wp_cache_get_last_changed( 'comment' );
// Fetch an entire level of the descendant tree at a time.
$level = 0;
$exclude_keys = array( 'parent', 'parent__in', 'parent__not_in' );
do {
// Parent-child relationships may be cached. Only query for those that are not.
$child_ids = array();
$uncached_parent_ids = array();
$_parent_ids = $levels[ $level ];
if ( $_parent_ids ) {
$cache_keys = array();
foreach ( $_parent_ids as $parent_id ) {
$cache_keys[ $parent_id ] = "get_comment_child_ids:$parent_id:$key:$last_changed";
}
$cache_data = wp_cache_get_multiple( array_values( $cache_keys ), 'comment-queries' );
foreach ( $_parent_ids as $parent_id ) {
$parent_child_ids = $cache_data[ $cache_keys[ $parent_id ] ];
if ( false !== $parent_child_ids ) {
$child_ids = array_merge( $child_ids, $parent_child_ids );
} else {
$uncached_parent_ids[] = $parent_id;
}
}
}
if ( $uncached_parent_ids ) {
// Fetch this level of comments.
$parent_query_args = $this->query_vars;
foreach ( $exclude_keys as $exclude_key ) {
$parent_query_args[ $exclude_key ] = '';
}
$parent_query_args['parent__in'] = $uncached_parent_ids;
$parent_query_args['no_found_rows'] = true;
$parent_query_args['hierarchical'] = false;
$parent_query_args['offset'] = 0;
$parent_query_args['number'] = 0;
$level_comments = get_comments( $parent_query_args );
// Cache parent-child relationships.
$parent_map = array_fill_keys( $uncached_parent_ids, array() );
foreach ( $level_comments as $level_comment ) {
$parent_map[ $level_comment->comment_parent ][] = $level_comment->comment_ID;
$child_ids[] = $level_comment->comment_ID;
}
$data = array();
foreach ( $parent_map as $parent_id => $children ) {
$cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed";
$data[ $cache_key ] = $children;
}
wp_cache_set_multiple( $data, 'comment-queries' );
}
++$level;
$levels[ $level ] = $child_ids;
} while ( $child_ids );
// Prime comment caches for non-top-level comments.
$descendant_ids = array();
for ( $i = 1, $c = count( $levels ); $i < $c; $i++ ) {
$descendant_ids = array_merge( $descendant_ids, $levels[ $i ] );
}
_prime_comment_caches( $descendant_ids, $this->query_vars['update_comment_meta_cache'] );
// Assemble a flat array of all comments + descendants.
$all_comments = $comments;
foreach ( $descendant_ids as $descendant_id ) {
$all_comments[] = get_comment( $descendant_id );
}
// If a threaded representation was requested, build the tree.
if ( 'threaded' === $this->query_vars['hierarchical'] ) {
$threaded_comments = array();
$ref = array();
foreach ( $all_comments as $k => $c ) {
$_c = get_comment( $c->comment_ID );
// If the comment isn't in the reference array, it goes in the top level of the thread.
if ( ! isset( $ref[ $c->comment_parent ] ) ) {
$threaded_comments[ $_c->comment_ID ] = $_c;
$ref[ $_c->comment_ID ] = $threaded_comments[ $_c->comment_ID ];
// Otherwise, set it as a child of its parent.
} else {
$ref[ $_c->comment_parent ]->add_child( $_c );
$ref[ $_c->comment_ID ] = $ref[ $_c->comment_parent ]->get_child( $_c->comment_ID );
}
}
// Set the 'populated_children' flag, to ensure additional database queries aren't run.
foreach ( $ref as $_ref ) {
$_ref->populated_children( true );
}
$comments = $threaded_comments;
} else {
$comments = $all_comments;
}
return $comments;
}
/**
* Used internally to generate an SQL string for searching across multiple columns.
*
* @since 3.1.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $search Search string.
* @param string[] $columns Array of columns to search.
* @return string Search SQL.
*/
protected function get_search_sql( $search, $columns ) {
global $wpdb;
$like = '%' . $wpdb->esc_like( $search ) . '%';
$searches = array();
foreach ( $columns as $column ) {
$searches[] = $wpdb->prepare( "$column LIKE %s", $like );
}
return ' AND (' . implode( ' OR ', $searches ) . ')';
}
/**
* Parse and sanitize 'orderby' keys passed to the comment query.
*
* @since 4.2.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $orderby Alias for the field to order by.
* @return string|false Value to used in the ORDER clause. False otherwise.
*/
protected function parse_orderby( $orderby ) {
global $wpdb;
$allowed_keys = array(
'comment_agent',
'comment_approved',
'comment_author',
'comment_author_email',
'comment_author_IP',
'comment_author_url',
'comment_content',
'comment_date',
'comment_date_gmt',
'comment_ID',
'comment_karma',
'comment_parent',
'comment_post_ID',
'comment_type',
'user_id',
);
if ( ! empty( $this->query_vars['meta_key'] ) ) {
$allowed_keys[] = $this->query_vars['meta_key'];
$allowed_keys[] = 'meta_value';
$allowed_keys[] = 'meta_value_num';
}
$meta_query_clauses = $this->meta_query->get_clauses();
if ( $meta_query_clauses ) {
$allowed_keys = array_merge( $allowed_keys, array_keys( $meta_query_clauses ) );
}
$parsed = false;
if ( $this->query_vars['meta_key'] === $orderby || 'meta_value' === $orderby ) {
$parsed = "$wpdb->commentmeta.meta_value";
} elseif ( 'meta_value_num' === $orderby ) {
$parsed = "$wpdb->commentmeta.meta_value+0";
} elseif ( 'comment__in' === $orderby ) {
$comment__in = implode( ',', array_map( 'absint', $this->query_vars['comment__in'] ) );
$parsed = "FIELD( {$wpdb->comments}.comment_ID, $comment__in )";
} elseif ( in_array( $orderby, $allowed_keys, true ) ) {
if ( isset( $meta_query_clauses[ $orderby ] ) ) {
$meta_clause = $meta_query_clauses[ $orderby ];
$parsed = sprintf( 'CAST(%s.meta_value AS %s)', esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) );
} else {
$parsed = "$wpdb->comments.$orderby";
}
}
return $parsed;
}
/**
* Parse an 'order' query variable and cast it to ASC or DESC as necessary.
*
* @since 4.2.0
*
* @param string $order The 'order' query variable.
* @return string The sanitized 'order' query variable.
*/
protected function parse_order( $order ) {
if ( ! is_string( $order ) || empty( $order ) ) {
return 'DESC';
}
if ( 'ASC' === strtoupper( $order ) ) {
return 'ASC';
} else {
return 'DESC';
}
}
}
$from, $to );
}
return $keys;
}
private static function yoast_duplicate_post() {
add_filter( 'duplicate_post_excludelist_filter', function( $meta_excludelist ) {
$exclude_list = [
Document::TYPE_META_KEY,
'_elementor_page_assets',
'_elementor_controls_usage',
'_elementor_css',
'_elementor_screenshot',
];
return array_merge( $meta_excludelist, $exclude_list );
} );
add_action( 'duplicate_post_post_copy', function( $new_post_id, $post ) {
$original_template_type = get_post_meta( $post->ID, Document::TYPE_META_KEY, true );
if ( ! empty( $original_template_type ) ) {
update_post_meta( $new_post_id, Document::TYPE_META_KEY, $original_template_type );
}
}, 10, 2 );
}
/**
* Process post meta before WP importer.
*
* Normalize Elementor post meta on import, We need the `wp_slash` in order
* to avoid the unslashing during the `add_post_meta`.
*
* Fired by `wp_import_post_meta` filter.
*
* @since 1.0.0
* @access public
* @static
*
* @param array $post_meta Post meta.
*
* @return array Updated post meta.
*/
public static function on_wp_import_post_meta( $post_meta ) {
$is_wp_importer_before_0_7 = self::is_wp_importer_before_0_7();
if ( $is_wp_importer_before_0_7 ) {
foreach ( $post_meta as &$meta ) {
if ( '_elementor_data' === $meta['key'] ) {
$meta['value'] = wp_slash( $meta['value'] );
break;
}
}
}
return $post_meta;
}
/**
* Is WP Importer Before 0.7
*
* Checks if WP Importer is installed, and whether its version is older than 0.7.
*
* @return bool
*/
public static function is_wp_importer_before_0_7() {
$wp_importer = get_plugins( '/wordpress-importer' );
if ( ! empty( $wp_importer ) ) {
$wp_importer_version = $wp_importer['wordpress-importer.php']['Version'];
if ( version_compare( $wp_importer_version, '0.7', '<' ) ) {
return true;
}
}
return false;
}
/**
* Process post meta before WXR importer.
*
* Normalize Elementor post meta on import with the new WP_importer, We need
* the `wp_slash` in order to avoid the unslashing during the `add_post_meta`.
*
* Fired by `wxr_importer.pre_process.post_meta` filter.
*
* @since 1.0.0
* @access public
* @static
*
* @param array $post_meta Post meta.
*
* @return array Updated post meta.
*/
public static function on_wxr_importer_pre_process_post_meta( $post_meta ) {
$is_wp_importer_before_0_7 = self::is_wp_importer_before_0_7();
if ( $is_wp_importer_before_0_7 ) {
if ( '_elementor_data' === $post_meta['key'] ) {
$post_meta['value'] = wp_slash( $post_meta['value'] );
}
}
return $post_meta;
}
}
Fatal error: Uncaught Error: Class 'Elementor\Compatibility' not found in /var/www/html/helitower.com.br/web/wp-content/plugins/elementor/includes/plugin.php:848
Stack trace:
#0 /var/www/html/helitower.com.br/web/wp-content/plugins/elementor/includes/plugin.php(620): Elementor\Plugin->__construct()
#1 /var/www/html/helitower.com.br/web/wp-content/plugins/elementor/includes/plugin.php(861): Elementor\Plugin::instance()
#2 /var/www/html/helitower.com.br/web/wp-content/plugins/elementor/elementor.php(53): require('/var/www/html/h...')
#3 /var/www/html/helitower.com.br/web/wp-settings.php(517): include_once('/var/www/html/h...')
#4 /var/www/html/helitower.com.br/web/wp-config.php(99): require_once('/var/www/html/h...')
#5 /var/www/html/helitower.com.br/web/wp-load.php(50): require_once('/var/www/html/h...')
#6 /var/www/html/helitower.com.br/web/wp-blog-header.php(13): require_once('/var/www/html/h...')
#7 /var/www/html/helitower.com.br/web/index.php(18): require('/var/www/html/h...')
#8 {main}
thrown in /var/www/html/helitower.com.br/web/wp-content/plugins/elementor/includes/plugin.php on line 848