按观看次数排序产品

时间:2018-05-24 22:02:26

标签: wordpress woocommerce hook-woocommerce

我使用的插件已经计算了产品视图,并将其存储在一个名为' mwb_wpr_data'的表中。

列出产品视图的查询是:

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

productid领域是Woocomerce产品的FK。

如何修改Woocommerce默认排序,以便按照表格中的大多数观看次序显示产品' mwb_wpr_data'?

使用插件Post View Counter的当前代码:

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');
    }
}

5 个答案:

答案 0 :(得分:2)

据我说你已经设置了正确的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');
    }
}

答案 1 :(得分:1)

不确定您正在使用的插件(如果您提供有关它的其他信息会很棒)但我已经使用Post Views Counter多年了,而且效果非常好。

它甚至还有 WP_Query 的查询参数(通过帖子浏览查询帖子):

编辑:如果没有Post Views Counter插件,此查询参数将无效,因为它不是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;

我希望这有帮助, 干杯!

答案 2 :(得分:1)

好的,所以这样做的正确方法是

  1. 更改您的帖子视图计数的存储方式,以便将它们存储为_post_views_count等字段中每个产品(帖子)的postmeta。

  2. 使用meta_key&在这样的wp_query中订购

    $args = array(
        'meta_key' => '_post_views_count',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );
    
  3. <编辑>

    如果您想使用相同的插件来记录您的产品视图,我会设置一个函数,每次将帖子视图添加到更新产品的postmeta字段的表格时都会触发该函数。

    优雅吗?否。

    会起作用吗?是。

答案 3 :(得分:1)

根据插件文档,您还需要传递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 arg,即。

 $query->set('post_type', 'product');

答案 4 :(得分:0)

如果要显示观看次数最多的产品,则可以按照以下步骤操作。

步骤:1,我使用(add_menu_page)函数在管理面板中添加了菜单。在功能文件中

function admin_manage_users22(){
add_menu_page('My Page Title', 'MVP', 'manage_options', 'MVP_backend_view', 
'MVP_backend_view' );
}
add_action('admin_menu', 'admin_manage_users22');

步骤:2在用户查看带有帖子ID的wp_postmeta中的产品+1计数器值后,获取产品详细信息。默认值设置1

function MVP_product_details($product ) {

$post_id = get_the_ID();
$count_key = 'AK_product_view_count';
$count     = get_post_meta( $post_id, $count_key, true );
if ( empty( $count ) ) {
    delete_post_meta( $post_id, $count_key );
    update_post_meta( $post_id, $count_key, '1' );
    echo "count null"; 
}else{
    $count ++;
    update_post_meta( $post_id, $count_key, (string) $count );
}
}
 add_filter( 'woocommerce_quantity_input_args', 'MVP_product_details', 10, 2 );

步骤:3现在,您只需使用以下代码即可查看最多的产品详细信息。

function MVP_backend_view(){
$count_key                = 'AK_product_view_count';
$query_args               = array(
    'posts_per_page' => 3,
    'no_found_rows'  => 1,
    'post_status'    => 'publish',
    'post_type'      => 'product',
    'orderby'        => 'meta_value',
    'order'          => 'DESC',
    'meta_key'       => $count_key,
);
$query_args['meta_query'] = array(
    array(
        'key'     => $count_key,
        'value'   => '0',
        'type'    => 'numeric',
        'compare' => '>',
    ),
);
$zwcmvp_query = new WP_Query( $query_args );