Intereting Posts
Должен ли я использовать таблицу WordPress Options или создавать таблицу базы данных ..? wordpress 3.0 json issue Тема Blask Jetpack Portfolio в настоящее время слишком много столбцов Является ли хорошей практикой включать настраиваемые параметры при регистрации типа сообщения? Отсутствует временная папка, несмотря на настройки в wp-config.php Как сортировать любимые плагины по алфавиту? htaccess блокирует прямой доступ к изображениям и все еще может захватить изображения с помощью wp_remote_get, установив реферирование заголовка? .htaccess домашняя конфигурация Создание плагина Quote Использование 'posts_where' в запросе с настраиваемым полем Пользовательская форма AJAX не работает async Редактор WYSIWYG в плагине WP 3.2 Разрешить вход в систему пользователям, которые не принадлежат к whitelisted ips Показывать виджеты редактора только на страницах, которые используют конкретный шаблон? текст заполнителя в категории

Пользовательский запрос: как сначала получить липкие сообщения?

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

Одна вещь, о которой я подумал, включает как минимум 2 запроса:

  • сначала создайте простую функцию для повторного использования только для вывода html

  • вторая делает запрос только постыдных сообщений и выводит html (в соответствии с заданными максимальными элементами)

  • в-третьих, есть еще место для новых предметов в соответствии с максимальными элементами, сделать запрос, исключая липкие сообщения, и снова вывести html.

Итак, все это началось бы так (и далее продолжайте …):

$max_items = 5; $sticky_ids = get_option('sticky_posts'); if(count($sticky_ids) != 0){ //query degli sticky $sticky_soon_query = new WP_Query(); $sticky_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => $max_items, 'post__in' => $sticky_ids )); } 

Есть ли еще более элегантное решение?

Дальнейшее обновление: просто построил класс для размещения в functions.php или, возможно, в плагине. Я сделал это в основном потому, что хочу почти всегда иметь липкие сообщения, возможно, больше в петлях на странице. Так получилось много дублирования. Поэтому вот базовый класс, который, безусловно, может быть exapanded / perfectioned каким-то образом, но для моих потребностей просто работает:

 class Posts_With_Sticky{ public $max_items_amount; public $normal_items_amount; public $category; public $sticky_ids; public $sticky_query; public $normal_query; function __construct($category = null, $max_items_amount = 5){ $this->max_items_amount = $max_items_amount; $this->sticky_ids = get_option('sticky_posts'); $this->category = $category; $this->get_query(); } public function get_query(){ //sticky query if(count($this->sticky_ids) != 0){ $this->sticky_query = new WP_Query(); $this->sticky_query->query(array( 'category_name' => $this->category, 'posts_per_page' => $this->max_items_amount, 'post__in' => $this->sticky_ids )); } //check amount of stikies and room for normals if(isset($this->sticky_query)){ $stikies = count($this->sticky_query->posts); if($stikies == $this->max_items_amount) return; else $this->normal_items_amount = $this->max_items_amount - $stikies; } //normal posts query $this->normal_query = new WP_Query(); $this->normal_query->query(array( 'category_name' => $this->category, 'posts_per_page' => $this->normal_items_amount, 'post__not_in' => $this->sticky_ids )); }//end get_query public function render_posts($sticky_loop_function, $normal_loop_function = "", $before_markup = "", $after_markup = ""){ if(!$sticky_loop_function) return; //shortcut $sticky_setted = isset($this->sticky_query); $normal_setted = isset($this->normal_query); if(!$sticky_setted && !$normal_setted) return; $sticky_loop = $sticky_loop_function; $normal_loop = ($normal_loop_function !== "") ? $normal_loop_function : $sticky_loop_function; echo $before_markup; if($sticky_setted) $sticky_loop($this->sticky_query); if($normal_setted) $normal_loop($this->normal_query); echo $after_markup; }//end render_posts }//end Posts_With_Sticky 

Затем на html-странице я напишу другую функцию цикла для каждого раздела, а затем передам ее в render_posts ().

Что-то вроде этого:

  <?php //html output function function write_soon_items($query){ while($query->have_posts()){ $query->the_post(); $date = get_the_date('dmY'); $title = get_the_title(); $excerpt = get_the_excerpt(); $link = get_permalink(); echo <<< ITEM_BLOCK <article> <h4> $date - $title </h4> <p> <a href="$link" title="$title">$excerpt</a> </p> <div class="float-reset"></div> </article> ITEM_BLOCK; } }//end write_sub_items $soon_posts = new Posts_With_Sticky('coming-soon'); $soon_posts->render_posts('write_soon_items') ?> в  <?php //html output function function write_soon_items($query){ while($query->have_posts()){ $query->the_post(); $date = get_the_date('dmY'); $title = get_the_title(); $excerpt = get_the_excerpt(); $link = get_permalink(); echo <<< ITEM_BLOCK <article> <h4> $date - $title </h4> <p> <a href="$link" title="$title">$excerpt</a> </p> <div class="float-reset"></div> </article> ITEM_BLOCK; } }//end write_sub_items $soon_posts = new Posts_With_Sticky('coming-soon'); $soon_posts->render_posts('write_soon_items') ?> 

Поэтому каждый раз, когда мне нужен цикл, который отличает липкие сообщения определенной категории, я просто делаю еще один экземпляр Posts_With_Sticky, а затем вызываю его метод render_posts (), передающий функцию специализированного выходного цикла.

Обратите внимание, что вы можете передать render_posts () функцию для стикеров, функцию для нормалей (если вы этого не сделаете, первая будет использована), «before_markup» и «after_markup».

Надеюсь, это поможет кому-то.

до свидания

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

 <?php //html output function function write_sub_items($query){ while($query->have_posts()){ $query->the_post(); $date = get_the_date('dmY'); $title = get_the_title(); $excerpt = get_the_excerpt(); echo <<< ITEM_BLOCK <li> <h4> $date - $title </h4> <p> $excerpt </p> </li> ITEM_BLOCK; } }//end write_sub_items $max_items_amount = 5; $normal_items_amount = $max_items_amount; $sticky_ids = get_option('sticky_posts'); //sticky query if(count($sticky_ids) != 0){ $sticky_soon_query = new WP_Query(); $sticky_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => 5, 'post__in' => $sticky_ids )); } //check amount of stikies and room for normals if(isset($sticky_soon_query)){ $stikies = count($sticky_soon_query->posts); if($stikies <= $max_items_amount) { $normal_items_amount = $max_items_amount - $stikies; } } //normal posts query if($normal_items_amount > 0){ $normal_soon_query = new WP_Query(); $normal_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => $normal_items_amount, 'post__not_in' => $sticky_ids )); } //shortcut $stiky_setted = isset($sticky_soon_query); $normal_setted = isset($normal_soon_query); ?> <?php if($stiky_setted || $normal_setted) : ?> <ul> <?php if($stiky_setted){ write_sub_items($sticky_soon_query); } ?> <?php if($normal_setted){ write_sub_items($normal_soon_query); } ?> </ul> <?php endif; ?> в <?php //html output function function write_sub_items($query){ while($query->have_posts()){ $query->the_post(); $date = get_the_date('dmY'); $title = get_the_title(); $excerpt = get_the_excerpt(); echo <<< ITEM_BLOCK <li> <h4> $date - $title </h4> <p> $excerpt </p> </li> ITEM_BLOCK; } }//end write_sub_items $max_items_amount = 5; $normal_items_amount = $max_items_amount; $sticky_ids = get_option('sticky_posts'); //sticky query if(count($sticky_ids) != 0){ $sticky_soon_query = new WP_Query(); $sticky_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => 5, 'post__in' => $sticky_ids )); } //check amount of stikies and room for normals if(isset($sticky_soon_query)){ $stikies = count($sticky_soon_query->posts); if($stikies <= $max_items_amount) { $normal_items_amount = $max_items_amount - $stikies; } } //normal posts query if($normal_items_amount > 0){ $normal_soon_query = new WP_Query(); $normal_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => $normal_items_amount, 'post__not_in' => $sticky_ids )); } //shortcut $stiky_setted = isset($sticky_soon_query); $normal_setted = isset($normal_soon_query); ?> <?php if($stiky_setted || $normal_setted) : ?> <ul> <?php if($stiky_setted){ write_sub_items($sticky_soon_query); } ?> <?php if($normal_setted){ write_sub_items($normal_soon_query); } ?> </ul> <?php endif; ?> 

Хорошо, нет ответов. В любом случае, просто поделиться, пока мое (рабочее) решение выглядит примерно так:

  <?php //html output function function write_sub_items($query){ while($query->have_posts()){ $query->the_post(); $date = get_the_date('dmY'); $title = get_the_title(); $excerpt = get_the_excerpt(); echo <<< ITEM_BLOCK <li> <h4> $date - $title </h4> <p> $excerpt </p> </li> ITEM_BLOCK; } }//end write_sub_items $max_items_amount = 5; $normal_items_amount = $max_items_amount; $sticky_ids = get_option('sticky_posts'); //sticky query if(count($sticky_ids) != 0){ $sticky_soon_query = new WP_Query(); $sticky_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => 5, 'post__in' => $sticky_ids )); } //check amount of stikies and room for normals if(isset($sticky_soon_query)){ $stikies = count($sticky_soon_query->posts); if($stikies == $max_items_amount) return; else $normal_items_amount = $max_items_amount - $stikies; } //normal posts query $normal_soon_query = new WP_Query(); $normal_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => $normal_items_amount, 'post__not_in' => $sticky_ids )); //shortcut $stiky_setted = isset($sticky_soon_query); $normal_setted = isset($normal_soon_query); ?> <?php if($stiky_setted || $normal_setted) : ?> <ul> <?php if($stiky_setted){ write_sub_items($sticky_soon_query); } ?> <?php if($normal_setted){ write_sub_items($normal_soon_query); } ?> </ul> <?php endif; ?> в  <?php //html output function function write_sub_items($query){ while($query->have_posts()){ $query->the_post(); $date = get_the_date('dmY'); $title = get_the_title(); $excerpt = get_the_excerpt(); echo <<< ITEM_BLOCK <li> <h4> $date - $title </h4> <p> $excerpt </p> </li> ITEM_BLOCK; } }//end write_sub_items $max_items_amount = 5; $normal_items_amount = $max_items_amount; $sticky_ids = get_option('sticky_posts'); //sticky query if(count($sticky_ids) != 0){ $sticky_soon_query = new WP_Query(); $sticky_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => 5, 'post__in' => $sticky_ids )); } //check amount of stikies and room for normals if(isset($sticky_soon_query)){ $stikies = count($sticky_soon_query->posts); if($stikies == $max_items_amount) return; else $normal_items_amount = $max_items_amount - $stikies; } //normal posts query $normal_soon_query = new WP_Query(); $normal_soon_query->query(array( 'category_name' => 'coming-soon', 'posts_per_page' => $normal_items_amount, 'post__not_in' => $sticky_ids )); //shortcut $stiky_setted = isset($sticky_soon_query); $normal_setted = isset($normal_soon_query); ?> <?php if($stiky_setted || $normal_setted) : ?> <ul> <?php if($stiky_setted){ write_sub_items($sticky_soon_query); } ?> <?php if($normal_setted){ write_sub_items($normal_soon_query); } ?> </ul> <?php endif; ?> 

«Скорее» слово в названиях варов ничего важного. Здесь, в моем проекте, я пишу код для новостей «скоро», вот и все.