Intereting Posts
Вставить phpBB в WordPress? Многостраничные поля WordPress Обновление post_parent по id (много раз) Shortcode для вытягивания определенного внешнего контура заголовка сообщения, когда идентификатор передается в Выполнять действия по публикации или обновлению? получить идентификатор продукта дочерней категории Woocommerce Что генерирует мое мета-описание: description? Добавление «перенаправления» на кнопку Пользовательские теги сообщений, отображаемые в разделе «Обычные сообщения» WordPress the_content () возвращает только одно изображение из определенной категории Почему заголовок сообщения и контент автоматически отображаются в миниатюре сообщения (Лучшее изображение)? Как включить внешний PHP-файл в поддиректор WordPress? Как использовать сжатие без потерь с помощью WP_Image_Editor Пользовательский запрос $ wpdb для пользовательских типов сообщений по категориям язык полиланга на домен отключен

wp_query добавлять аргументы, используя array_push, если переменная встречается

Мне нужно добавить больше аргументов в wp_query, если они являются переменными! Empty, когда они передаются по короткому коду. Я передаю имя пары пользовательских имен полей, которые будут использоваться в цикле.

Я хочу, чтобы он работал следующим образом: Если custom_field_1 пуст, а custom_field_2 пуст, добавьте первый массив в массив $ args. Если custom_field_1 is! Empty и custom_field_2 is! Empty, добавьте второй массив в массив $ args.

Я чувствую, что я где-то на футбольном поле, но он работает неправильно. Если я вручную добавлю каждую из meta_queries в массив $ args, он вернет правильные данные.

Любая помощь будет оценена по достоинству.

// Attributes extract( shortcode_atts( array( 'pagination' => 'true', 'query' => '', 'category' => '', 'tag_name' => '', 'custom_field_1' => '', 'custom_field_2' => '', 'relation_operator' => '', 'number_posts' => '', 'order_by' => '', 'order' => '', ), $atts )); $paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1; $custom_field_query = array (); // if $custom_field_1 is not empty and $custom_field_2 is empty if (!empty($custom_field_1) && empty($custom_field_2) ) { array_push($custom_field_query, array ( 'meta_query' => array( array( 'key' => $custom_field_1, 'value' => '', 'compare' => '!=' ) ) ) ); } // if $custom_field_1 is not empty and $custom_field_2 is not empty if (!empty($custom_field_1) && !empty($custom_field_2) ) { array_push($custom_field_query, array ( 'meta_query' => array( 'relation' => $relation_operator, array( 'key' => $custom_field_1, 'value' => '', 'compare' => '!=', ), array( 'key' => $custom_field_2, 'value' => '', 'compare' => '!=', ) ) ) ); } // if $custom_field_query has array custom_field_query gets added to $args if(!empty($custom_field_query)){ $args['custom_field_query'] = $custom_field_query; } // WP_Query arguments $args = array( 'paged' => $paged, 'post_type' => array( 'page', ' post' ), 'post_status' => array( 'publish' ), 'category_name' => $category, 'tag' => $tag_name, 'category__in' => $theCatId, 'posts_per_page' => $number_posts, 'order' => $order, 'orderby' => $order_by, ); // The Query global $wp_query,$paged,$post; $my_query = new WP_Query( $args ); 

Я бы предложил попробовать не слишком усложнять логику. У вас есть общий мыслительный процесс правильно в вашем вопросе. Предполагая, что все вышеописанное работает, когда вы просто добавляете логику meta_query в запрос напрямую и запускаете его, тогда ваш код должен попытаться следовать тому же шаблону мысли.

Вы обращаетесь к глобалам – так перечислите их. Это также сделает так, что они легко будут ссылаться позже, когда вам нужно вернуться к тому, что вы сделали:

  // Globals. global $wp_query, $paged, $post; 

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

Примечание . Вам нужно будет обновить места, где вы ссылаетесь на переменные, извлеченные со ссылкой на ваш массив атрибутов shortcode. Я просто назвал его $ sc для этого примера.

  // Shortcode attributes. $sc = shortcode_atts( array( 'pagination' => 'true', 'query' => '', 'category' => '', 'tag_name' => '', 'custom_field_1' => '', 'custom_field_2' => '', 'relation_operator' => '', 'number_posts' => '', 'order_by' => '', 'order' => '', ), $atts ); 

Затем вы хотите изменить свои аргументы WP_Query, если ваши условия выполнены, поэтому добавьте аргументы запроса по умолчанию, $ args:

Примечание : get_query_var принимает значение по умолчанию в качестве переданного второго аргумента, поэтому вы можете вырезать это условное выражение и преобразовать его в int с помощью набора параметров по умолчанию (это значительно быстрее, чем логика, используемая в вопросе, и дает тот же результат [т.е. вызов intval по сравнению с casting to int]). Я бы, вероятно, просто привязал это к вашим $ args напрямую, а не задал для него переменную.

  // WP_Query arguments $args = array( 'paged' => ( int ) get_query_var( 'paged', 1 ), 'post_type' => array( 'page', ' post' ), 'post_status' => array( 'publish' ), 'category_name' => $sc['category'], 'tag' => $sc['tag_name'], 'category__in' => $theCatId, 'posts_per_page' => $sc['number_posts'], 'order' => $sc['order'], 'orderby' => $sc['order_by'], ); 

Теперь вы хотите добавить свои условия и изменить аргументы, если выполняются определенные вещи:

Примечание . Вы можете использовать if (! Empty ($ custom_field_1)), если хотите. Я просто нахожу, что ($ custom_field_1) легче читать / быстрее писать, но это только личные предпочтения.

  // custom_field_1 is populated. if ( $sc['custom_field_1'] ) { // custom_field_2 is populated. if ( $sc['custom_field_2'] ) { $args['meta_query'] = array( 'relation' => $sc['relation_operator'], array( 'key' => $sc['custom_field_1'], 'value' => '', 'compare' => '!=', ), array( 'key' => $sc['custom_field_2'], 'value' => '', 'compare' => '!=', ), ) ); // custom_field_2 is not populated. } else { $args['meta_query'] = array( array( 'key' => $sc['custom_field_1'], 'value' => '', 'compare' => '!=', ), ); } } 

Теперь вы изменили аргументы по своему усмотрению, поэтому создайте свой запрос:

  // Custom query $my_query. $my_query = new WP_Query( $args ); 

Я не видел никакой ссылки на $ theCatId, поэтому я предполагаю, что вы обрабатываете это где-то еще в своем скрипте. Вещи также можно было бы написать более эффективно, чем то, что я сделал из вашего примера кода, но в любом случае это, надеюсь, поможет вам указать правильное направление получения желаемого результата.

Все вышеперечисленное вместе:

  // Globals. global $wp_query, $paged, $post; // Shortcode attributes. $sc = shortcode_atts( array( 'pagination' => 'true', 'query' => '', 'category' => '', 'tag_name' => '', 'custom_field_1' => '', 'custom_field_2' => '', 'relation_operator' => '', 'number_posts' => '', 'order_by' => '', 'order' => '', ), $atts ); // WP_Query arguments $args = array( 'paged' => ( int ) get_query_var( 'paged', 1 ), 'post_type' => array( 'page', ' post' ), 'post_status' => array( 'publish' ), 'category_name' => $sc['category'], 'tag' => $sc['tag_name'], 'category__in' => $theCatId, 'posts_per_page' => $sc['number_posts'], 'order' => $sc['order'], 'orderby' => $sc['order_by'], ); // custom_field_1 is populated. if ( $sc['custom_field_1'] ) { // custom_field_2 is populated. if ( $sc['custom_field_2'] ) { $args['meta_query'] = array( 'relation' => $sc['relation_operator'], array( 'key' => $sc['custom_field_1'], 'value' => '', 'compare' => '!=', ), array( 'key' => $sc['custom_field_2'], 'value' => '', 'compare' => '!=', ), ) ); // custom_field_2 is not populated. } else { $args['meta_query'] = array( array( 'key' => $sc['custom_field_1'], 'value' => '', 'compare' => '!=', ), ); } } // Custom query $my_query. $my_query = new WP_Query( $args );