@nikitoshq

Как переопределить класс в WP?

У меня есть класс плагина WooCommerce : Automattic\WooCommerce\Internal\Admin\ProductReviews\ReviewsListTable
wp-content/plugins/woocommerce/src/Internal/Admin/ProductReviews/ReviewsListTable.php

У него есть 2 метода
prepare_items - отображает в админке айтемы ревью
get_review_count - и возвращает их количество

Для метода prepare_items я написал функцию которая добавляет фильтр по моему кастомному мета-полю
add_filter( 'woocommerce_product_reviews_list_table_prepare_items_args', 'structured_data_modify_product_reviews_query' );

function structured_data_modify_product_reviews_query($args) {
    return wp_parse_args(get_filter_api_review_id_arguments(), $args);
}

function get_filter_api_review_id_arguments() {
    $args = [];
    $args['meta_query'] = [
        [
            'key' => 'custom_field',
            'compare' => 'NOT EXISTS',
        ],
    ];
    return $args;
}

Теперь мне надо добавить этот фильтр и для метода get_review_count (чтобы возвращало правильное количество ревью), но сложность в том что у этого метода нет хука, и не совсем понимаю как можно изменить поведение этого метода не меня core файлы плагина
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@nikitoshq Автор вопроса
Если кому-то интересно, то пофиксил так, не самый хороший подход, но все же:

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();
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Наследованием и переопределением?
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;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы