Как сделать WC meta_query для переменных продуктов через их вариации? - PullRequest
1 голос
/ 22 апреля 2019

В продуктах WooCommerce у меня есть настраиваемое мета-поле с именем "amazon_price", и я хочу скрыть, чтобы продукты не отображались во внешнем интерфейсе, если для этого настраиваемого поля "amazon_price" не установлена ​​цена.

Я использовалЭтот код выполняет фильтрацию, которая отлично работает для простых продуктов, но не показывает переменные продукты, даже если у них установлено поле «amazon_price». Думаю, причина этой проблемы в том, что этот код может искать значение поля «amazon_price» наосновной идентификатор сообщения для продукта, так что я думаю, что это может быть поиск основного идентификатора сообщения для переменного продукта вместо поиска этого поля в идентификаторе переменной, но даже если мое предположение было верным, я все еще не знаю, как это исправить.

add_action( 'woocommerce_product_query', 'apm_products_meta_query' );
function apm_products_meta_query( $q ){
    $meta_query = $q->get( 'meta_query' );

    $meta_query[] = array(
        'key'       => 'amazon_price',
        'value'     => 0,
        'compare'   => '>'
    );

    $q->set( 'meta_query', $meta_query );
}

1 Ответ

0 голосов
/ 22 апреля 2019

Я не думаю, что возможно сделать мета-запрос WC для вариантов продукта переменных продуктов. Но с помощью пользовательского легкого SQL-запроса вы можете сделать все одновременно:

// The custom SQL query
function custom_query_incl_ids() {
    global $wpdb;

    $meta_key = 'amazon_price';

    return $wpdb->get_col( "
        SELECT DISTINCT p.ID FROM {$wpdb->prefix}posts p
        LEFT JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
        WHERE p.post_type = 'product' AND p.post_status = 'publish'
        AND ( ( pm.meta_key = '$meta_key' AND pm.meta_value > 0 )
        OR p.ID IN (
            SELECT DISTINCT v.post_parent FROM {$wpdb->prefix}posts v
            LEFT JOIN {$wpdb->prefix}postmeta as vm ON v.ID = vm.post_id
            WHERE v.post_type = 'product_variation'
            AND v.post_status = 'publish' AND v.post_parent > 0
            AND vm.meta_key = '$meta_key' AND vm.meta_value > 0
        ) )
    ");
}

// The WC query
add_action( 'woocommerce_product_query', 'product_query_action_callback' );
function product_query_action_callback( $q ){
    $q->set( 'post__in', (array) custom_query_incl_ids() );
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

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