【问题标题】:Woocommerce recently viewed ProductsWoocommerce 最近查看的产品
【发布时间】:2020-07-15 22:19:53
【问题描述】:

我创建了一个最近查看的脚本,该脚本生成了一个短代码,然后我将其插入到我的主页中。

该脚本的设计是为了让那些可能访问过我的网站并离开的人在回来后可以立即看到他们上次访问时查看的产品。

我已输入简码[woocommerce_recently_viewed_products]

并使用以下脚本生成了短代码:

function rc_woocommerce_recently_viewed_products( $atts, $content = null ) {

// Get shortcode parameters
extract(shortcode_atts(array(
    "per_page" => '5'
), $atts));

// Get WooCommerce Global
global $woocommerce;

// Get recently viewed product cookies data
$viewed_products = ! empty( $_COOKIE['woocommerce_recently_viewed'] ) ? (array) explode( '|', $_COOKIE['woocommerce_recently_viewed'] ) : array();
$viewed_products = array_filter( array_map( 'absint', $viewed_products ) );

// If no data, quit
if ( empty( $viewed_products ) )
    return __( 'You have not viewed any product yet!', 'rc_wc_rvp' );

// Create the object
ob_start();

wc_setcookie( 'woocommerce_recently_viewed', implode( '|', $viewed_products ) );
}

// Get products per page
if( !isset( $per_page ) ? $number = 4 : $number = $per_page )

// Create query arguments array
$query_args = array(
                'posts_per_page' => $number, 
                'no_found_rows'  => 1, 
                'post_status'    => 'publish', 
                'post_type'      => 'product', 
                'post__in'       => $viewed_products, 
                'orderby'        => 'rand'
                );

// Add meta_query to query args
$query_args['meta_query'] = array();

// Check products stock status
$query_args['meta_query'][] = $woocommerce->query->stock_status_meta_query();

// Create a new query
$r = new WP_Query($query_args);

// If query return results
if ( $r->have_posts() ) {

    $content = '<ul class="rc_wc_rvp_product_list_widget">';

    // Start the loop
    while ( $r->have_posts()) {
        $r->the_post();
        global $product;

        $content .= '<li>
            <a href="' . get_permalink() . '">
                ' . ( has_post_thumbnail() ? get_the_post_thumbnail( $r->post->ID, 'shop_thumbnail' ) : woocommerce_placeholder_img( 'shop_thumbnail' ) ) . ' ' . get_the_title() . '
            </a> ' . $product->get_price_html() . '
        </li>';
    }

    $content .= '</ul>';

}

// Get clean object
$content .= ob_get_clean();

// Return whole content
return $content;
}

// Register the shortcode
add_shortcode("woocommerce_recently_viewed_products", 
"rc_woocommerce_recently_viewed_products");

一切似乎都已注册。但是,当我自己测试时。我查看了一些产品,回到注册短代码的主页,我看到了文字

您还没有查看任何产品!

我不知道在注册和展示我或潜在客户可能查看过的产品时可能缺少什么。

【问题讨论】:

  • 缺少设置 cookie 的代码...您可以添加它来编辑您的问题吗?
  • @LoicTheAztec 我错过了设置的 cookie。我尝试添加但得到相同的结果,我更新了问题
  • is_product()条件为真时需要设置cookie。
  • @AndrewSchultz 所以代码显示正确,只是顺序错误?我已经尝试移动 wc_setcookie() 但仍然得到相同的结果

标签: wordpress woocommerce shortcode


【解决方案1】:

如果 woocommerce_recently_viewed_products 小部件处于活动状态,Woocommerce 仅保存最近查看的 cookie!请参阅 wc-product-functions.php wc_track_product_view() 函数中的代码。

始终将 cookie 保存在 functions.php 中的代码:

/**
 * Track product views. Always.
 */
function wc_track_product_view_always() {
    if ( ! is_singular( 'product' ) /* xnagyg: remove this condition to run: || ! is_active_widget( false, false, 'woocommerce_recently_viewed_products', true )*/ ) {
        return;
    }

    global $post;

    if ( empty( $_COOKIE['woocommerce_recently_viewed'] ) ) { // @codingStandardsIgnoreLine.
        $viewed_products = array();
    } else {
        $viewed_products = wp_parse_id_list( (array) explode( '|', wp_unslash( $_COOKIE['woocommerce_recently_viewed'] ) ) ); // @codingStandardsIgnoreLine.
    }

    // Unset if already in viewed products list.
    $keys = array_flip( $viewed_products );

    if ( isset( $keys[ $post->ID ] ) ) {
        unset( $viewed_products[ $keys[ $post->ID ] ] );
    }

    $viewed_products[] = $post->ID;

    if ( count( $viewed_products ) > 15 ) {
        array_shift( $viewed_products );
    }

    // Store for session only.
    wc_setcookie( 'woocommerce_recently_viewed', implode( '|', $viewed_products ) );
}

remove_action('template_redirect', 'wc_track_product_view', 20);
add_action( 'template_redirect', 'wc_track_product_view_always', 20 );

【讨论】:

  • 优秀的解决方案谢谢
【解决方案2】:

您需要在查看单个产品页面时设置 cookie,因此请使用类似的方法,我将 cookie 设置为与我刚刚查看的产品 ID 相同。在您的情况下,您需要获取 cookie 值(如果存在),然后将新产品附加到产品列表中。

function set_user_visited_product_cookie() {
    global $post;

    if ( is_product() ){
        // manipulate your cookie string here, explode, implode functions
        wc_setcookie( 'woocommerce_recently_viewed', $post->ID );
    }
}

add_action( 'wp', 'set_user_visited_product_cookie' );

【讨论】:

  • 我已经修改了我的代码以包含此内容。它现在可以工作了,有点大声笑。我可以继续查看 10 种产品,它现在只显示我查看的第一个。
  • 是的,我只对其进行了编码以保存一个产品 ID,您的作业是更改它,以便它使用您已经编写的功能来附加产品 ID 和“|”成一个字符串并保存。
  • 我在网上看了看,看不到任何指向正确方向的东西。我试过if ( is_product() ){ wc_setcookie( 'woocommerce_recently_viewed', explode( '|', $post-&gt;ID) ); } ...和if ( is_product() ){ wc_setcookie( 'woocommerce_recently_viewed', $post-&gt;ID, explode( '|', $_COOKIE['woocommerce_recently_viewed']) ); ....以及很多不同的变体,包括if ( is_product() ){ wc_setcookie( 'woocommerce_recently_viewed', $post-&gt;ID, explode( '|', $post-&gt;ID, 4) );以及将$post->ID更改为$viewed_products
【解决方案3】:

下面设置 cookie 'woocommerce_recently_viewed' 的代码对我有用。希望对其他人有所帮助

$Existing_product_id = $_COOKIE['woocommerce_recently_viewed'];
if ( is_product() )
{ 
   $updated_product_id = $Existing_product_id.'|'.$post->ID;
   wc_setcookie( 'woocommerce_recently_viewed',  $updated_product_id ); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多