Запрос для сортировки списка по метаклавише сначала (если это существует), и выставочные сообщения оставлений без метаклавиши, заказанной заголовком

Я работаю над пользовательским шаблоном страницы термина таксономии, где мы хотим объекты, которые подключены к термину, отсортированному по году издания (пользовательское поле даты) - и если существует несколько объектов в тот же день (отформатированы как YYYY-MM-DD) к, затем сортируют тех, которые заголовком и наконец видом заголовком, если пользовательское поле не было заполнено (более старые объекты).

Так, я попробовал его сотня различных путей с WP_query, и это действительно возвращает большинство результатов, поскольку я хочу их - но в этом случае это только возвращает объекты, которые имеют meta_key publication_date. Все другие объекты игнорируются и не отображаются. Я попробовал meta_query с помощью отношения "или" и сравнил publication_date, как СУЩЕСТВУЕТ и НЕ СУЩЕСТВУЕТ, но это возвратило 0 результатов для меня.

Кроме того, сайт работает 3.5.2 все еще, и они не хотят обновлять.

Вот мой новый запрос, который получает меня сообщения, которые имеют publication_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-запрос, но я действительно не уверен, как выполнить то, что я хочу делать это. Если бы кто-то мог бы помочь мне, который был бы удивительным!

Заранее спасибо.

23
17.12.2013, 18:06
3 ответа

Поблагодарите Вас все за свою справку!

В конце запрос ниже получил меня результаты, которых я требовал - который должен был показать и отсортировать сообщения по пользовательскому полю "publication_date" сначала - сортировка по дате, и если бы были несколько из той же даты (скажите, 4 отмеченных июня 2013), то это отсортировало бы тех, которые заголовком. Затем после того, как это пробегает все сообщения, которым заполнили Год издания, это циклично выполнится через снова остающиеся сообщения, в алфавитном порядке заголовком.

Это получает меня набор результатов в том же запросе и сохраняет мое разбиение на страницы:

$term = get_queried_object();
the_post();
$wp_query = new WP_Query( array(
'post_type' => 'resource',
    'tax_query' => array(
        array(
            'taxonomy' => 'resource_types',
            'field' => 'slug',
            'terms' => $term->name,
        )),
 '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'
            )
        ),
'meta_key' => 'publication_date',
'orderby' => 'meta_value title',
'order' => 'ASC',
'paged' => $paged,
'posts_per_page' => '10',
));
20
19.02.2020, 21:56
  • 1
    Хороший. Я никогда не думал для выполнения два meta_query на том же ключе! –  GhostToast 19.12.2013, 18:13
  • 2
    Для меня (использование WordPress 4.1.1), если я установил meta_key это автоматически не включает его даже с NOT EXISTS. Я действительно надеюсь, что делаю что-то не так. –  Ryan Taylor 25.03.2015, 00:59
  • 3
    @RyanTaylor то же здесь - meta_key не должно быть установлено в запросе для этого работать, но это, действительно кажется, заказывает правильно значением meta, даже когда метаклавиша не установлена. –  jammypeach 21.01.2016, 12:50
  • 4
    Как выше комментариев, для WP 4.1 + удаляют или комментируют 'meta_key' => 'publication_date',. –  MikeiLL 14.07.2016, 08:35

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

$found_posts = array();
while($loop->have_posts()): $loop->the_post();
    // loop stuff
    $found_posts[] = get_the_id();
endwhile;

wp_reset_query();

$args = array(
    // other args
    'post__not_in' => $found_posts,
);

Затем выполните свой второй цикл.

2
19.02.2020, 21:56
  • 1
    Попытка этого теперь, спасибо. Сообщит, работает ли это! –  CSSgirl 17.12.2013, 19:00
  • 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'), ) ); –  CSSgirl 17.12.2013, 19:11
  • 3
    Хм. Не то, чтобы я могу думать. –  GhostToast 17.12.2013, 19:18

Есть ли какая-либо причина, Вы не могли осуществить publication_date метаклавишу для существования для каждого сообщения только с пустым значением?

Таким образом в Вашем save_post действие Вы добавили бы/обновили бы метаклавишу ли $_POST значение пусто или нет.

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

add_action( 'admin_init', 'update_old_posts' );
function update_old_posts() {
    if ( ! isset( $_GET[ 'update_old_posts' ] ) )
         return;

    foreach( get_posts() as $post ) {
        if ( false === get_post_meta( $post->ID, 'publication_date', true ) ) {
             update_post_meta( $post->ID, 'publication_date', '' );
             echo "Updated {$post->post_title} <br />";
        }
    }

    die;
}

Выполните его путем просмотра на http://example.com/wp-admin/?update_old_posts

Затем можно использовать тот же запрос, как Вы имеете. Можно хотеть добавить дополнительный фильтр, чтобы позволить Вам заказать различными столбцами в различных направлениях, он сделал бы для обнаружения мне к виду по дате в порядке убывания и заголовку в порядке возрастания.

add_filter( 'posts_orderby', 'multicolumn_orderby', 10, 2 );
function multicolumn_orderby( $orderby, $query ) {
    global $wpdb;

    // check it's the right query
    if ( $query->get( 'meta_key' ) == 'publication_date' ) {
         $orderby = "$wpdb->postmeta.meta_value+0 DESC, $wpdb->posts.post_title ASC";
    }

    return $orderby;
}
2
19.02.2020, 21:56
  • 1
    Хм, я не думал об этом. Я собираюсь дать этому попытку и видеть, как она идет, Спасибо! –  CSSgirl 17.12.2013, 20:24

Теги

Похожие вопросы