Intereting Posts
Пользовательские архивы таксономии на странице пользовательского типа отправки Возможно ли иметь два разных превью сообщения (т. Е. Два шаблона для одного сообщения)? Заказ запроса с использованием настраиваемых метаданных Связанный список тегов из определенной категории, упорядоченных по счету как создать базу данных, чтобы использовать ее на веб-сайте WordPress? Перенаправление на первый ребенок в пользовательском типе сообщений (без шаблона) Foreach внутри foreach Невозможно вызвать WPDB внутри шаблона RSS WordPress Multisite предоставляет пользователям доступ к определенным страницам администратора Как редактировать виджеты в WordPress Добавление класса к следующему / предыдущему изображению в файле attachment.php htaccess конфликт между WordPress и защищенным паролем подкаталогом Заказ по DESC, ASC в пользовательском WP_Query Как получить URI для темы без домена. Пример: / wp-content / themes / my-theme Как добавить атрибут к выводу с помощью wp_video_shortcode add_filter

Показать последние и последние сообщения в той же категории

Есть ли способ показать не только самые последние должности в категории, но и 3 должности в категории более поздние (по времени), чем текущая публикация?

Например, Jan10post Jan15post Jan17post | Jan22post (в настоящее время просматривает) | Jan23post Jan30post Feb2post

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

function my_custom_loop_2 ($category, $tag, $offset) { $args=array( // showposts has been replaced, use 'posts_per_page' instead // 'showposts' =>1, 'posts_per_page' => 3, // this has been replaced, use 'ignore_sticky_posts' // 'caller_get_posts' => 1, 'ignore_sticky_posts' => true, ); if ($category) { $args['cat'] = $category; } if ($tag) { $args['tag'] = $tag; } if ($offset) { $args['offset'] = $offset; } $my_query = new WP_Query($args); // ... rest of function to output loop if( $my_query->have_posts() ) { while ($my_query->have_posts()) : $my_query->the_post(); ?> <div class="three-titles"> <a href="<?php the_permalink() ?>" ><?php the_title(); ?></a></br> </div> <?php endwhile; } //if ($my_query) wp_reset_query(); // Restore global post data stomped by the_post(). 

}; а также

 <?php my_custom_loop_3(13, NULL, 1); ?> 

Соревнование:

Получите n = количество старых и новых сообщений из последних сообщений с теми же категориями и / или тегами.

Решение:

Как и @ TwerkingN00b, нам нужен какой-то пользовательский SQL. Магическая фраза SQL, которую мы ищем, – UNION .

UNION используется для объединения результата из нескольких операторов SELECT в единый результирующий набор.

Все остальное – это знание того, как WordPress обрабатывает SQL-запросы, как получить соответствующие данные, а затем собрать все вместе. Давайте начнем:

Настройка основ. Наш ссылочный пост (= текущий идентификатор, если ничего не поддерживается), его дата и некоторые пустые переменные дополнительно мы хотим направить наш запрос, чтобы игнорировать или принимать связанные категории или термины.

 function the_assoc_posts($post_id = 0, $quantity = 3, $ignore_categories = false, $ignore_tags = false) { if (empty($post_id)) $post_id = get_the_ID(); if (empty($post_id)) return; $post_id = get_the_ID(); $date = get_the_date( 'Ymd H:i:s', $post_id ); $cat = array(); $tag = array(); 

Теперь нам нужно получить все категории нашего сообщения.

  if (!$ignore_categories) { $post_categories = wp_get_post_terms( $post_id, 'category' ); if (!empty($post_categories) && is_array($post_categories)) { foreach ($post_categories as $category) { $cat[] = $category->term_id; } $cat = implode(',',$cat); } } 

Теперь нам нужно получить все post_tags нашего сообщения.

  if (!$ignore_tags) { $post_tags = wp_get_post_terms( $post_id ); if (!empty($post_tags) && is_array($post_tags)) { foreach ($post_tags as $post_tag) { $tag[] = $post_tag->term_id; } $tag = implode(',', $tag); } } 

Поскольку WordPress не поддерживает такие запросы (пока), мы должны перестроить базовый запрос и адаптировать его к нашим потребностям.

  global $wpdb, $post; $innerjoin = array(); $where = array(); if (!empty($cat)) { $innerjoin[]= "INNER JOIN $wpdb->term_relationships AS tt1 ON ($wpdb->posts.ID = tt1.object_id)"; $where[] = "tt1.term_taxonomy_id IN ($cat)"; } if (!empty($tag)) { $innerjoin[]= "INNER JOIN $wpdb->term_relationships AS tt2 ON ($wpdb->posts.ID = tt2.object_id)"; $where[] = "tt2.term_taxonomy_id IN ($tag)"; } $innerjoin = implode("\n", $innerjoin); if (!empty($where)) $where = 'WHERE ('.implode(" AND \n", $where).') AND'; else $where = "WHERE"; $query = "SELECT $wpdb->posts.ID, $wpdb->posts.post_date as DateOrder, 2 SortOrder FROM $wpdb->posts {$innerjoin} {$where} $wpdb->posts.ID = {$post_id} UNION ALL (SELECT $wpdb->posts.ID, $wpdb->posts.post_date, 3 FROM $wpdb->posts {$innerjoin} {$where} $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_date > '{$date}' GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_date ASC LIMIT $quantity) UNION ALL (SELECT $wpdb->posts.ID, $wpdb->posts.post_date, 1 FROM $wpdb->posts {$innerjoin} {$where} $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_date < '{$date}' GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_date DESC LIMIT $quantity) ORDER BY SortOrder ASC, DateOrder DESC"; ,  global $wpdb, $post; $innerjoin = array(); $where = array(); if (!empty($cat)) { $innerjoin[]= "INNER JOIN $wpdb->term_relationships AS tt1 ON ($wpdb->posts.ID = tt1.object_id)"; $where[] = "tt1.term_taxonomy_id IN ($cat)"; } if (!empty($tag)) { $innerjoin[]= "INNER JOIN $wpdb->term_relationships AS tt2 ON ($wpdb->posts.ID = tt2.object_id)"; $where[] = "tt2.term_taxonomy_id IN ($tag)"; } $innerjoin = implode("\n", $innerjoin); if (!empty($where)) $where = 'WHERE ('.implode(" AND \n", $where).') AND'; else $where = "WHERE"; $query = "SELECT $wpdb->posts.ID, $wpdb->posts.post_date as DateOrder, 2 SortOrder FROM $wpdb->posts {$innerjoin} {$where} $wpdb->posts.ID = {$post_id} UNION ALL (SELECT $wpdb->posts.ID, $wpdb->posts.post_date, 3 FROM $wpdb->posts {$innerjoin} {$where} $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_date > '{$date}' GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_date ASC LIMIT $quantity) UNION ALL (SELECT $wpdb->posts.ID, $wpdb->posts.post_date, 1 FROM $wpdb->posts {$innerjoin} {$where} $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_date < '{$date}' GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_date DESC LIMIT $quantity) ORDER BY SortOrder ASC, DateOrder DESC"; 

Я нашел основы о том, как получить строки до и после определенной строки в stackoverflow, и там также объяснялась сортировка. Чтобы узнать, как обрабатывается текущая версия WordPress (v4.4), я построил пользовательский запрос с параметрами tax_query и повторил SQL.

Теперь нам нужно пройти через найденные сообщения.

  $loop = $wpdb->get_results($query); if ( $loop ) { foreach ( $loop as $row ) { $post = get_post($row->ID); setup_postdata( $post ); ?> <div class="three-titles"> <a href="<?php the_permalink() ?>"<?php echo (get_the_ID() == $post_id?' class="current"':'')?>><?php the_title(); ?></a></br> </div> <?php } } wp_reset_postdata(); } 

И мы получили результаты. Чтобы получить связанные сообщения:

  • Внутри цикла: the_assoc_posts();
  • Вне цикла: the_assoc_posts($post_id);
  • С макс. из 5 связанных должностей: the_assoc_posts($post_id, 5);
  • Игнорировать связанные категории: the_assoc_posts(null, 3, false);
  • Игнорировать связанные теги: the_assoc_posts(null, 3, true, false);