Исключить сгруппированные товары детей в woocommerce, без исключения простых товаров - PullRequest
0 голосов
/ 26 марта 2020

Этот код работает, но мне нужно включить один продукт без связанного с ним родительского продукта

add_action( 'woocommerce_product_query', 'remove_grouped_children' );
function remove_grouped_children( $q ) {

    //get current loop query
    $taxonomy_query = $q->get('tax_query') ;

    //appends the grouped products condition
    $taxonomy_query['relation'] = 'AND';
    $taxonomy_query[] = array(
        'taxonomy' => 'product_type',
        'field' => 'slug',
        'terms' =>  array('grouped','variable')
    );


    $q->set( 'tax_query', $taxonomy_query );
}


1 Ответ

1 голос
/ 27 марта 2020

Это обход, но, наконец, работа.

function wr_convert_array_to_ids(){
    $products = wr_get_grouped_product_children();
    $post_ids = array();
    foreach ($products as $product){
        foreach ($product as $id){
            array_push($post_ids,$id);
        }
    }
    return $post_ids;
}


function wr_get_grouped_product_children(){
    global $wpdb;
    $products = $wpdb->get_results(
        $wpdb->prepare("SELECT * FROM $wpdb->prefix" . "postmeta WHERE meta_key = %s", '_children'),ARRAY_A
    );
    $products_id = array();
    foreach($products as $product){
        array_push($products_id, unserialize($product['meta_value']));
    }
    return $products_id;
}

function wr_custom_get_posts( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( $query->is_archive() || $query->is_shop()) {
        $query->set( 'post__not_in', wr_convert_array_to_ids() );
    }
}
add_action( 'pre_get_posts', 'wr_custom_get_posts', 1 ); 

Поскольку дочерние элементы сгруппированных продуктов живут в таблице post-meta под meta_key _children, который сохраняется как сериализованный массив, первым делом чтобы получить все дочерние элементы, затем сохранить их в массиве и вызвать действие pre_get_posts, чтобы исключить эти идентификаторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...