最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

php - WooCommerce Related Products by Attribute

programmeradmin0浏览0评论

I want to display products that are related either by category or attributes (not tags)

I've modified the solution posted here here to my needs:

function custom_related_product_args ( $args ){
    global $product;

    $cats          = wc_get_product_terms( $product->id, 'product_cat', array( 'fields' => 'slugs' ) );
    $brands        = wc_get_product_terms( $product->id, 'pa_brand', array( 'fields' => 'slugs' ) );
    $collections   = wc_get_product_terms( $product->id, 'pa_collection', array( 'fields' => 'slugs' ) );    

    unset( $args['post__in'] );
    $args['tax_query'] = array( 
        'relation' => 'OR',
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => $cats,
        ),
        array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'pa_brand',
                'field'    => 'slug',
                'terms'    => $brands,
            ),
            array(
                'taxonomy' => 'pa_collection',
                'field'    => 'slug',
                'terms'    => $collections,
            )
        )
    );

    return $args;
}
add_filter('woocommerce_related_products_args', 'custom_related_product_args');

However it doesn't seem to work for me and I can't figure out what I'm doing wrong?

I want to display products that are related either by category or attributes (not tags)

I've modified the solution posted here here to my needs:

function custom_related_product_args ( $args ){
    global $product;

    $cats          = wc_get_product_terms( $product->id, 'product_cat', array( 'fields' => 'slugs' ) );
    $brands        = wc_get_product_terms( $product->id, 'pa_brand', array( 'fields' => 'slugs' ) );
    $collections   = wc_get_product_terms( $product->id, 'pa_collection', array( 'fields' => 'slugs' ) );    

    unset( $args['post__in'] );
    $args['tax_query'] = array( 
        'relation' => 'OR',
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => $cats,
        ),
        array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'pa_brand',
                'field'    => 'slug',
                'terms'    => $brands,
            ),
            array(
                'taxonomy' => 'pa_collection',
                'field'    => 'slug',
                'terms'    => $collections,
            )
        )
    );

    return $args;
}
add_filter('woocommerce_related_products_args', 'custom_related_product_args');

However it doesn't seem to work for me and I can't figure out what I'm doing wrong?

Share Improve this question asked Feb 15, 2018 at 5:06 DanDan 1111 silver badge2 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 1

Disable default Related Products and try this (Add custom code to the functions.php)

add_action( 'woocommerce_after_single_product_summary', 'custom_output_product_collection', 12 );
function custom_output_product_collection(){

    ## --- YOUR SETTINGS --- ##

    $attribute = "attribute_slug"; // <== HERE define your attribute slug
    $limit     = "5";     // <== Number of products to be displayed
    $cols      = "5";     // <== Number of columns
    $orderby   = "rand";  // <== Order by argument (random order here)

    ## --- THE CODE --- ##

    global $post, $wpdb;

    // Formatting the attribute
    $attribute = sanitize_title( $attribute );
    $taxonomy  = 'pa_' . $attribute;

    // Get the WP_Term object for the current product and the defined product attribute
    $terms = wp_get_post_terms( $post->ID, $taxonomy );
    $term = reset($terms);

    // Get all product IDs that have  the same product attribute value (except current product ID)
    $product_ids = $wpdb->get_col( "SELECT DISTINCT tr.object_id
        FROM {$wpdb->prefix}term_relationships as tr
        JOIN {$wpdb->prefix}term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id
        JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
        WHERE tt.taxonomy LIKE '$taxonomy' AND t.term_id = '{$term->term_id}' AND tr.object_id != '{$post->ID}'" );

    // Convert array values to a coma separated string
    $ids = implode( ',', $product_ids );

    ## --- THE OUTPUT --- ##

    echo '<section class="'.$attribute.' '.$attribute.'-'.$term->slug.' products">
        <h2>'.__( "Collection", "woocommerce" ).': '.$term->name.'</h2>';

    echo do_shortcode("[products ids='$ids' columns='$cols' limit='$limit' orderby='$orderby']");

    echo '</section>';
}
global $product;

$cats          = wc_get_product_terms( $product->id, 'product_cat', array( 'fields' => 'slugs' ) );
$brands        = wc_get_product_terms( $product->id, 'pa_brand', array( 'fields' => 'slugs' ) );
$artists       = wc_get_product_terms( $product->id, 'pa_artist', array( 'fields' => 'slugs' ) );    
$manufacturers = wc_get_product_terms( $product->id, 'pa_manufacturer', array( 'fields' => 'slugs' ) );

unset( $args['post__in'] );
$args['tax_query'] = array( 
    'relation' => 'AND',
    array(
        'taxonomy' => 'product_cat',
        'field'    => 'slug',
        'terms'    => $cats,
    ),
    array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'pa_brand',
            'field'    => 'slug',
            'terms'    => $brands,
        ),
        array(
            'taxonomy' => 'pa_artist',
            'field'    => 'slug',
            'terms'    => $artists,
        ),
        array(
            'taxonomy' => 'pa_manufacturer',
            'field'    => 'slug',
            'terms'    => $manufacturers,
        )
    )
);

return $args;
发布评论

评论列表(0)

  1. 暂无评论