Мне нужно добавить больше аргументов в 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 );