Как я могу обновить функционал класса плагина WooCommerce: Automattic\WooCommerce\Internal\Admin\ProductReviews\ReviewsListTable, чтобы применить фильтр к методу get_review_count и модифицировать его поведение, не внося изменения в основные файлы плагина? В данный момент я уже успешно применил фильтр к методу prepare_items с помощью указанного кода.
Для изменения определения класса в WordPress нужно использовать хук 'init', который позволяет регистрировать новые классы или изменять существующие. Вот пример кода, который позволит изменить или дополнить определение класса: ```php add_action('init', function(){ if (class_exists('WooCommerce')) { class MyCustomReviewsListTable extends Automattic\WooCommerce\Internal\Admin\ProductReviews\ReviewsListTable { // здесь можно добавить новые методы или переопределить существующие } } }); ``` Чтобы обновить функционал класса ReviewsListTable плагина WooCommerce без изменений в основных файлах плагина, нужно использовать так называемый "monkey patching". Это позволит вам изменить поведение метода get_review_count, не внося изменений в исходный код плагина. Вот пример кода, который позволит вам применить фильтр к методу get_review_count класса ReviewsListTable: ```php add_filter('woocommerce_product_reviews_list_table_get_review_count', 'my_custom_review_count', 10, 2); function my_custom_review_count($review_count, $product_id){ // ваши изменения для метода get_review_count return $review_count; } ``` Таким образом, вы можете модифицировать поведение метода get_review_count класса ReviewsListTable плагина WooCommerce, не внося изменений в исходный код плагина.
Если кому-то интересно, то пофиксил так, не самый хороший подход, но все же:
class Structured_Data_List_Table extends ReviewsListTable { protected function get_review_count(string $status, int $product_id): int { $args = [ 'type__in' => ['review', 'comment'], 'status' => $this->convert_status_to_query_value($status), 'post_type' => 'product', 'post_id' => $product_id, 'count' => true, ]; $args['meta_query'] = [ [ 'key' => 'custom_field', 'compare' => 'NOT EXISTS', ], ]; return (int)get_comments($args); } } add_filter( 'woocommerce_product_reviews_list_table', 'replace_reviews_list_table_class', 10, 2 ); function replace_reviews_list_table_class( $output, $reviews_list_table ) { $structured_data_list_table = new Structured_Data_List_Table(); $structured_data_list_table->prepare_items(); ob_start(); ?> <div class="wrap"> <h2><?php echo esc_html( get_admin_page_title() ); ?></h2> <?php $structured_data_list_table->views(); ?> <form id="reviews-filter" method="get"> <?php $page = isset( $_REQUEST['page'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['page'] ) ) : 'product-reviews'; ?> <input type="hidden" name="page" value="<?php echo esc_attr( $page ); ?>" /> <input type="hidden" name="post_type" value="product" /> <input type="hidden" name="pagegen_timestamp" value="<?php echo esc_attr( current_time( 'mysql', true ) ); ?>" /> <?php $structured_data_list_table->search_box( __( 'Search Reviews', 'woocommerce' ), 'reviews' ); ?> <?php $structured_data_list_table->display(); ?> </form> </div> <?php return ob_get_clean(); }
Наследованием и переопределением?
class My_ReviewsListTable extends Automattic\WooCommerce\Internal\Admin\ProductReviews\ReviewsListTable { public function get_review_count($product_id) { $args = [ 'post_type' => 'product_review', 'post_status' => 'publish', 'meta_query' => [ [ 'key' => 'custom_field', 'compare' => 'NOT EXISTS', ], ], 'fields' => 'ids', ]; if($product_id) { $args['meta_query'][] = [ 'key' => '_product_id', 'value' => $product_id, 'compare' => '=', ]; } $query = new WP_Query($args); return $query->found_posts; } }