Сортировать товары по популярности - PullRequest
0 голосов
/ 25 мая 2018

Я использую плагин, который уже считает количество продуктов и хранит его в таблице с именем mwb_wpr_data.

Запрос для просмотра списка продуктов:

SELECT DISTINCT('productid') FROM 'mwb_wpr_data' WHERE 'action' = 'view'

Поле productid - это продукты FK to Woocomerce.

Как изменить сортировку по умолчанию в Woocommerce, чтобы она отображала товары по порядку большинства представлений в таблице 'mwb_wpr_data'?

Текущий код с помощью плагина Счетчик просмотров:

add_action( 'pre_get_posts', 'my_view_filter' );
function my_view_filter($query){
    if ( 
        $query->is_main_query() && 
        ( $query->is_home() || $query->is_archive() || $query->is_search() )
    ) {
            $query->set('suppress_filters', 'false');
            $query->set('orderby', 'post_views');
            $query->set('order', 'DESC');
    }
}

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

В соответствии с документацией к плагинам, вы должны также передать post_type для того, чтобы это работало, т.е.

$args = array(
    'order' => 'asc',
    'post_type' => 'event',
    // required by PVC
    'suppress_filters' => false,
    'orderby' => 'post_views',
    'fields' => ''
);
$most_viewed = get_posts( $args );

Этот код находится в посте, на который @Marounm ссылается в комментарии выше.

Попробуйте также передать аргумент post_type, т.е.

 $query->set('post_type', 'product');
0 голосов
/ 30 мая 2018

По моему мнению, вы установили правильный pre_get_post, но проблема в вашем условии if.

Вы установили current_user_can, неправильный фильтр для каждого пользователя, поэтому, если вы не авторизованы с ролью администратора, ваш запрос не будет работать.

current_user_can('administrator')

Удалите это выше одно из условия.

add_action( 'pre_get_posts', 'my_view_filter' );
function my_view_filter($query){
    if ($query->is_main_query() && ( $query->is_home() || $query->is_archive() || $query->is_search() )
    ) {
            $query->set('suppress_filters', 'false');
            $query->set('orderby', 'post_views');
            $query->set('order', 'DESC');
    }
}
0 голосов
/ 30 мая 2018

Хорошо, так что ПРАВИЛЬНЫЙ способ сделать это будет

  1. Измените, как хранятся ваши просмотры постов, чтобы они сохранялись как постметы каждого продукта (поста) вполе наподобие _post_views_count.

  2. Использовать meta_key & orderby в wp_query, как это

    $args = array(
        'meta_key' => '_post_views_count',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );
    

ЕСЛИ выЕсли вы хотите использовать один и тот же плагин для записи просмотров вашего продукта, я бы настроил функцию, которая запускается каждый раз, когда в таблицу добавляется представление записи, обновляющее поле postmeta продукта.

Это элегантно?Нет.

Будет ли это работать?Да.

0 голосов
/ 29 мая 2018

Не уверен насчет плагина, который вы используете (было бы здорово, если бы вы предоставили дополнительную информацию о нем), но я использую Счетчик просмотров постов в течение многих лет, и он работает очень хорошо.

У него даже есть параметр запроса для WP_Query (для запроса сообщений по просмотрам сообщений):

РЕДАКТИРОВАТЬ: Этот параметр запроса не будет работать без Счетчик просмотров постов плагин, поскольку он не является параметром WordPress по умолчанию.

Подробнее об API этого плагина здесь: https://dfactory.eu/docs/post-views-counter/developers-api/

$query_args = array(
    'posts_per_page'   => 12,
    'order'            => 'DESC',
    'suppress_filters' => false,  //required param
    'orderby'          => 'post_views',  //required param
);
$query      = new WP_Query( $query_args );

if ( $query->have_posts() ):
    while ( $query->have_posts() ): $query->the_post();

//Post content here
    echo get_the_title();

    endwhile;
endif;

Надеюсь, это поможет, ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...