通过访问单个产品页面更新 WooCommerce 产品元数据

问题描述 投票:0回答:1

我试图计算单个产品页面的浏览量,但我做不到。我很高兴能帮助解决我的问题...

add_action('template_redirect', 'update_product_data');
function update_product_data(){
     if (class_exists('WooCommerce') && is_product()) {
        $product = wc_get_product( get_the_ID() );
        $product_id = $product->get_id();
        $count   = (int) $product->get_meta('_click_counter');

        $count++;
        $product->update_meta_data('_click_counter', $count);
        $product->save();
    }
} 
php wordpress woocommerce metadata product
1个回答
0
投票

根据此答案线程,尝试以下操作:

// Utility function: Updating product views count
function single_product_views_count_update( $product ) {
    if( ! is_a($product, 'WC_Product') ) return;

    $count = (int) $product->get_meta('_views_counter');
    $product->update_meta_data('_views_counter', $count + 1);
    $product->save();
}

// Count single product views
add_action( 'woocommerce_single_product_summary', 'count_single_product_views' );
function count_single_product_views(){
    global $product;
    single_product_views_count_update( $product );
}

代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。


现在,如果您想避免同一用户的重复观看次数,您应该使用以下内容:

// Force non logged users WC Session cookie
add_action( 'woocommerce_init', 'force_non_logged_user_wc_session' );
function force_non_logged_user_wc_session(){ 
    if( is_user_logged_in() || is_admin() )
       return;

    if ( isset(WC()->session) && ! WC()->session->has_session() ) {
       WC()->session->set_customer_session_cookie( true ); 
    }
}

// Utility function: Get user viewed products
function get_user_viewed_products() {
    if ( is_user_logged_in() ) {
        $viewed_products = (array) get_user_meta( get_current_user_id(), 'viewed_products', true);
    } else {
        $viewed_products = (array) WC()->session->get('viewed_products');
    }
    return $viewed_products;
}

// Utility function: Updating user viewed products 
function update_user_viewed_products( $product_id ) {
    if ( is_user_logged_in() ) {
        $user_id    = get_current_user_id();
        $products   = get_user_meta( $user_id, 'viewed_products', true );
        if ( empty($products) ) {
            $products = array();
        }
        $products[] = $product_id;
        update_user_meta( $user_id, 'viewed_products', $products);
    } else {
        $products   = WC()->session->get('viewed_products');
        if ( empty($products) ) {
            $products = array();
        }
        $products[] = $product_id;
        WC()->session->set('viewed_products', $products);
    }
}

// Utility function: Updating product views count
function single_product_views_count_update( $product ) {
    if( ! is_a($product, 'WC_Product') ) return;

    if ( in_array( $product->get_id(), get_user_viewed_products() ) ) {
        return;
    } else {
        update_user_viewed_products( $product->get_id() );
    }

    $count = (int) $product->get_meta('_views_counter');
    $product->update_meta_data('_views_counter', $count + 1 );
    $product->save();
}

// Count single product views
add_action( 'woocommerce_single_product_summary', 'count_single_product_views' );
function count_single_product_views(){
    global $product;
    single_product_views_count_update( $product );
}

OP添加:在管理产品列表中显示产品视图

// Add a custom column to Admin product list
add_filter('manage_edit-product_columns', 'admin_product_views_counter_column');
function admin_product_views_counter_column($columns) {
    $columns['views_count'] = __('View', 'woocommerce');
    return $columns;
}

// Display the views counter for each product in the "View" column  
add_action('manage_product_posts_custom_column', 'admin_product_views_counter_column_content', 10, 2);
function admin_product_views_counter_column_content($column, $post_id) {
    if ($column === 'views_count') {
        global $product;

        echo (int) $product->get_meta('_views_counter');
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.