Intereting Posts

Функция в массиве как аргументы для WP_Query

У меня есть эта функция, жестко закодированная в content-single-product.php (WooCommerce), и она работает, чтобы показать 3 случайных продукта из категорий ID 64 и 72 :

$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => '3', 'orderby' => 'rand', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => array( 64, 72 ), ), ), ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); global $product; 

Теперь вместо hardcoding идентификатор категории я добавил пользовательское поле в продукт MyCustomField и написал в нем 64,72 . Затем я попытался изменить приведенный выше код для динамического заполнения:

 $MyCustomField = get_post_meta($post->ID, 'MyCustomField', true); $args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => '3', 'orderby' => 'rand', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => array( $MyCustomField ), ), ), ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); global $product; 

К сожалению, это работает неправильно:

'terms' => array( $MyCustomField )

потому что он отображает только продукты из первой категории (ID 64), а не из обоих, как я хочу.

Я программист новичка, так что я сделал не так? Благодаря!

Solutions Collecting From Web of "Функция в массиве как аргументы для WP_Query"

Я подозреваю, что проблема возникает из $MyCustomField который вы вводите как таковой в:

 'terms' => array( $MyCustomField ), 

Запрос рассматривает это как одно значение: '64,72' , строка.

Поэтому постарайтесь:

 $MyCustomFieldValues = array_map( 'intval', explode( ',', $MyCustomField ) ); 

Это также гарантирует, что ваши значения являются целыми числами.

Затем:

 'terms' => $MyCustomFieldValues, 

Из WordPress codex:

Отношение (строка) – Логическая взаимосвязь между каждым внутренним массивом таксономии при наличии более одного. Возможные значения: «И», «ИЛИ». Не используйте с одним внутренним массивом таксономии.

Мало других вещей, вы должны сохранять значения в пользовательскую мета как массив, WordPress автоматически сериализует это значение:

Использование update_post_meta автоматически сериализует любой массив, который вы передаете ему:

 update_post_meta( $post_id, 'MyCustomField', array( 64, 72 ) ); 

Тогда вы можете просто неэтериализовать его, когда вытягиваете значение:

 $MyCustomField = maybe_unserialize( get_post_meta( $post->ID, 'MyCustomField', TRUE ) ); 

Вероятно, вы также должны убедиться, что у вас есть значение перед вызовом WP_Query

 if( ! empty( $MyCustomField ) ){ $args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => '3', 'orderby' => 'rand', 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $MyCustomField, ), ), ); } 

Если ваш план состоит в том, чтобы добавить эти значения через интерфейс WP Admin (что означает, что вы хотите ввести CSV), тогда вы должны использовать подход @ClemC и использовать array_map , с array_map для преобразования в целые числа

Если вы передаете текст (строка) «64,72» функции, ожидающей массив целых чисел, тогда вам нужно перевести эту входящую строку в целочисленный массив. Попробуйте добавить этот оператор перед оператором $args = :

 $MyCustomField = array_map('intval', explode(',', $MyCustomField));