Я работаю над пользовательским шаблоном страницы терминов таксономии, в котором мы хотим, чтобы элементы, связанные с термином, были отсортированы по дате публикации (поле настраиваемой даты) - и если в один и тот же день есть несколько элементов (отформатированных как YYYY-MM- DD) затем сортировать их по заголовку и, наконец, сортировать по заголовку, если пользовательское поле не было заполнено (более старые элементы).
Итак, я попробовал его сотнями разных способов с WP_query, и он возвращает большинство результатов так, как я хочу - но в этом случае он возвращает только те элементы, которые имеют meta_key of публикации_даты. Все остальные элементы игнорируются и не отображаются. Я попробовал meta_query, используя отношение "или", и сравнил публикации_даты как EXISTS, а не EXISTS, но это вернуло мне 0 результатов.
Кроме того, на сайте все еще работает 3.5.2, и они не хотят обновляться.
Вот мой последний запрос, который возвращает мне сообщения, в которых настраиваемое поле publishing_date отображается в правильном порядке:
$term = get_queried_object(); // find the term of the taxonomy page we are on
$wp_query = new WP_Query( array(
'post_type' => 'resource',
'tax_query' => array(
array(
'taxonomy' => 'resource_types',
'field' => 'slug',
'terms' => $term->name,
)),
'meta_key' => 'publication_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
'posts_per_page' => '10',
));
Я также попытался использовать wpdb и выполнить SQL-запрос, но я действительно не уверен, как выполнить то, что я хочу сделать. Если бы кто-то мог мне помочь, это было бы здорово!
Заранее спасибо.
источник
'meta_query' => array( 'relation' => 'OR', array( //check to see if date has been filled out 'key' => 'publication_date', 'compare' => '!=', 'value' => date('Y-m-d'), ), array( //if no date has been added show these posts too 'key' => 'publication_date', 'value' => date('Y-m-d'), 'compare' => 'NOT EXISTS' ) ),
но порядок не работает: \Ответы:
Спасибо всем за вашу помощь!
В конце концов, приведенный ниже запрос дал мне результаты, которые я желал - чтобы показать и отсортировать записи сначала по настраиваемому полю «публикации_даты» - с сортировкой по дате, и если их было несколько для одной и той же даты (скажем, 4 помечены Июнь 2013), сортировка по названию. Затем, после прохождения всех постов, в которых указана Дата публикации, он снова будет перебирать оставшиеся посты в алфавитном порядке по заголовкам.
Это дает мне набор результатов в том же запросе и сохраняет мою нумерацию страниц:
источник
meta_query
на одном ключе!meta_key
его автоматически, он не включается даже сNOT EXISTS
. Я действительно надеюсь, что делаю что-то не так.'meta_key' => 'publication_date',
.Несколько лет спустя код, размещенный CSSGirl, не работал для меня, потому что были некоторые посты, у которых не было мета-ключа, или мета-ключ был пуст, так что это то, что я должен был сделать, чтобы все посты были упорядочены по дате. и покажите те, у которых значение мета-ключа отображается первым:
источник
Я думаю, что вам нужно сделать 2 отдельных цикла. Вы можете захватить все сообщения, найденные в первом цикле, и довольно легко исключить их из дополнительного цикла:
Затем запустите свой второй цикл.
источник
echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $publication_query->max_num_pages, 'prev_text' => __('Previous |'), 'next_text' => __('| Next'), ) );
Есть ли какая-то причина, по которой вы не могли принудительно установить мета-ключ публикации_даты для каждого сообщения только с пустым значением?
Таким образом, в вашем
save_post
действии вы добавляете / обновляете мета-ключ независимо от того,$_POST
пусто это значение или нет.Вам нужно будет запустить скрипт обновления, чтобы перебрать старые сообщения и добавить ключ с пустым значением, например:
Запустите его, перейдя по ссылке http://example.com/wp-admin/?update_old_posts
Тогда вы можете использовать тот же запрос, что и у вас. Возможно, вы захотите добавить дополнительный фильтр, чтобы можно было упорядочивать по разным столбцам в разных направлениях, для меня имеет смысл отсортировать по дате в порядке убывания и заголовок в порядке возрастания.
источник
Я создал пользовательский пункт where. Я тестировал его
$wp_query->request
прямо перед основным циклом, я не очень хорошо знаю SQL, но, похоже, все заработало.В качестве альтернативы, вы можете установить
compare
на'EXISTS'
и изменить строку в add_trending_where к$where .= " OR ($wpdb->postmeta.post_id IS NULL)";
. Тогда вам нужно будет только изменить значение ключа в одном месте. Опять же, эхом$wp_query->request
и поиграйте, если хотите лучше понять или подправить.РЕДАКТИРОВАТЬ: я только заметил, что это не работает, если
meta_key
задано в запросе. Вы можете использовать,$query->set('meta_key', NULL);
если вам нужно.РЕДАКТИРОВАТЬ 2: Я получил это работая с методом выше. По некоторым причинам это не было сначала (возможно meta_key был установлен ... я не знаю).
источник