#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 Да, это умная идея