Как выполнить WC meta_query для переменных продуктов через их варианты продукта?

#php #sql #wordpress #woocommerce #metadata

#php #sql #wordpress #woocommerce #метаданные

Вопрос:

В продуктах 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. Я действительно приношу извинения за это, несколько часов назад с now answer, поэтому я подумал, что если мой вопрос пойдет после страницы 1 или 2, у меня вообще не будет изменений, чтобы получить ответ, поэтому я дублировал его. кстати, я удалил дублированные вопросы.

Ответ №1:

Я не думаю, что возможно создать WC meta query для вариантов продукта переменных продуктов. Но с помощью пользовательского легкого 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 файл вашей активной дочерней темы (или active theme). Протестировано и работает.

Комментарии:

1. Большое спасибо за ответ, который, похоже, отлично работает для цикла продукта по умолчанию, однако я всегда использую плагин фильтра, который имеет встроенный фильтр запросов. Это функция, которую я использовал с этим плагином, который работал хорошо, но имел основную проблему с переменными продуктами « add_filter(‘prdctfltr_meta_query’, ‘prdctfltr_apm_query’); функция prdctfltr_apm_query($meta_query) { $ meta_query[] = array( ‘key’ => ‘amazon_price’, ‘value’ => 0, ‘сравнить’ => ‘>’ ); возвращает $meta_query; } «

2. Итак, мне интересно, как реализовать ваш запрос с помощью этого фильтра, задающего этот синтаксис? Я попробовал « $meta_query = product_query_action_callback();« но это не сработало

3.@IslamMohamed При использовании post__in кажется, что он отключает мета-запрос налоговый запрос тоже). Итак, вам нужно включить свой запрос в SQL…

4. Я думаю, поскольку я должен использовать этот фильтр, этот плагин предоставляет ‘prdctfltr_meta_query’ для выполнения запроса, и поскольку этот wp-фильтр ожидает мета_запрос WC в качестве входных данных, поэтому я подумал об идее изменить функцию сохранения пользовательского поля, чтобы значение пользовательского поля (для варианта с наибольшим значением) сохранялось не только в идентификаторе варианта, но и в родительском идентификаторе записи, что вы думаете об этой идее?

5. @IslamMohamed Да, это умная идея