Woocommerce 8.x.x - 挂钩 - woocommerce_product_lated_posts_query

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

我正在尝试定制woocommerce相关产品

第一点是:查询不会针对每个请求的页面进行更新,正如我在服务器负载方面可以想象的那样。

那么我如何强制存储每个页面的自定义结果?

第二点是:我的要求是强制相关产品仅选择同一主类别中的产品。

但是好像不起作用。

如果您有任何线索让我找出为什么它不返回好的产品。

最终的 $query 看起来像这样

array(4) { ["fields"]=> string(45) " SELECT DISTINCT ID FROM WCCP_posts p " ["join"]=> string(548) " LEFT JOIN ( SELECT object_id FROM WCCP_term_relationships WHERE term_taxonomy_id IN ( 7 ) ) AS exclude_join ON exclude_join.object_id = p.ID INNER JOIN ( SELECT object_id FROM WCCP_term_relationships INNER JOIN WCCP_term_taxonomy using( term_taxonomy_id ) WHERE term_id IN ( 87,2490,2788,283,67 ) ) AS include_join ON include_join.object_id = p.ID INNER JOIN WCCP_term_relationships ON p.ID = WCCP_term_relationships.object_id INNER JOIN WCCP_term_taxonomy USING( term_taxonomy_id ) LEFT JOIN WCCP_icl_translations AS icl ON icl.element_id = p.ID " ["where"]=> string(263) " WHERE 1=1 AND p.post_status = 'publish' AND p.post_type = 'product' AND exclude_join.object_id IS NULL AND p.ID NOT IN ( 0,1705 ) AND WCCP_term_taxonomy.taxonomy = 'product_cat' AND WCCP_term_taxonomy.term_id = 2490 AND icl.language_code = 'fr' " ["limits"]=> string(17) " LIMIT 24 " }


if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {

    function custom_related_products_query( $query, $product_id ) {
        global $wpdb;

        $categories = get_the_terms( $product_id, 'product_cat' );
        if ( empty( $categories ) ) {
            return $query;
        }
        var_dump($categories);
        // Get the main product category
        $main_category = null;
        foreach ( $categories as $category ) {
            if ( $category->parent == 0 ) {
                $main_category = $category;
                break;  
            }
        }

        // 
        if ( ! $main_category ) {
            echo "pas de categorie principale";
            return $query;
        }

        $query['join']   .= " INNER JOIN {$wpdb->term_relationships} ON p.ID = {$wpdb->term_relationships}.object_id";
        $query['join']   .= " INNER JOIN {$wpdb->term_taxonomy} USING( term_taxonomy_id )";
        $query['where']  .= " AND {$wpdb->term_taxonomy}.taxonomy = 'product_cat' AND {$wpdb->term_taxonomy}.term_id = {$main_category->term_id}";

        return $query;
    }
    add_filter( 'woocommerce_product_related_posts_query', 'custom_related_products_query', 10, 2 );

    function custom_related_products_orderby( $orderby ) {
        return "p.ID DESC";
    }
    add_filter( 'woocommerce_product_related_posts_orderby', 'custom_related_products_orderby', 10, 1 );
}

我尝试了在帖子顶部分享的 function.php 中的钩子。

它应该返回仅链接到产品页面相同类别的产品ID列表

sql wordpress woocommerce hook-woocommerce
2个回答
0
投票

我尝试了另一种方法,过滤所有不属于同一类别的产品,但它的工作太多,有时结果是“没有产品”,即使这个类别中有产品

add_filter( 'woocommerce_related_products', 'exclude_related_products', 10, 3 );

函数排除_相关产品($相关帖子,$产品ID,$参数){ 全局 $wpdb;

$categories = get_the_terms( $product_id, 'product_cat' );
if ( empty( $categories ) ) {
    return $related_posts;
}


$cat_ids = wp_list_pluck( $categories, 'term_id' );


$exclude_ids = $wpdb->get_col(
        "SELECT DISTINCT p.ID
         FROM {$wpdb->posts} p
         INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
         INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
         WHERE tt.taxonomy = 'product_cat'
         AND tt.term_id NOT IN (" . implode( ',', $cat_ids ) . ")
         AND p.post_status = 'publish'
         AND p.post_type = 'product'", 
);

// Excluez ces IDs de la liste des produits associés
return array_diff( $related_posts, $exclude_ids );

}


0
投票

好吧,只是与你分享

我终于尝试了另一种方式并成功满足了这个请求:

因此,将其添加到 function.php 并激活 Yoast 插件将:

仅显示当前产品类别的最后 4 个产品

add_filter('woocommerce_related_products', 'include_related_products',10 , 3 );

function include_related_products($related_posts, $product_id, $args){
    global $wpdb;
    $primary_category_id = null;
    $primary_category_id = yoast_get_primary_term_id('product_cat');
    if ( ! $primary_category_id ) {
        return $related_posts;
    }
    $include_ids = $wpdb->get_col(
            "SELECT DISTINCT p.ID
             FROM {$wpdb->posts} p
             INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
             INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
             WHERE tt.taxonomy = 'product_cat'
             AND tt.term_id = " . $primary_category_id . "
             AND p.post_status = 'publish'
             AND p.post_type = 'product'
             ORDER BY p.ID DESC
             LIMIT 4" 
    );
    return array_diff($include_ids);
}
© www.soinside.com 2019 - 2024. All rights reserved.