Прилепленные записи (Sticky Posts)

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

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

прилепить пост на главную страницу

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

  • на главной странице
  • во всех дополнительных циклах (например через WP_Query)

На страницах рубрик и меток повышенный приоритет записей будет проигнорирован — там эта фишка не работает.

Если вы прилепите сразу несколько постов, то между собой они будут сортироваться по дате публикации.

Как вывести все прилепленные посты

IDы всех постов, у которых включена эта опция (как на скриншоте), сохраняются в базе данных в виде массива. Поэтому вывести только прилепленные посты не составит труда:

$params = array(
	'posts_per_page' => -1, // нужно для отображения всех постов, без разделения по страницам
	'post__in'  => get_option( 'sticky_posts' ), // например Array ( [0] => 54 [1] => 1 )
);
 
$q = new WP_Query( $params );
 
while ($q->have_posts()) : $q->the_post();
	// HTML-шаблон вывода поста
endwhile; wp_reset_postdata();

Подробнее про параметры для WP_Query().

Отключение повышенного приоритета для прилепленных записей

То есть в этом случае все записи будут выводиться как обычно — с сортировкой по дате.

На главной странице:

add_action( 'pre_get_posts', 'turn_off_sticky_on_homepage' );
 
function turn_off_sticky_on_homepage( $query ) {
	if ( !is_admin() && $query->is_main_query() ) {
		$query->set( 'ignore_sticky_posts', true );
	}
}

Только в дополнительных циклах внутри страниц:

add_action( 'pre_get_posts', 'turn_off_sticky_on_queries' );
 
function turn_off_sticky_on_queries( $query ) {
	if ( !is_admin() && !$query->is_main_query() ) {
		$query->set( 'ignore_sticky_posts', true );
	}
}

Везде абсолютно:

add_action( 'pre_get_posts', 'turn_off_sticky' );
 
function turn_off_sticky( $query ) {
	$query->set( 'ignore_sticky_posts', true );
}

Оформление в CSS

В этом вам поможет функция post_class(), потому что она добавляет для всех прилепленных постов класс sticky (но только на главной странице).

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

После этого в CSS можно добавить что-нибудь в этом духе:

.sticky {
	color:#fe0000;
}
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 13

  • Руслан6 мая 2013 в 14:05 #

    Полезная вещь)

  • Евгений28 августа 2013 в 11:08 #

    Почему-то не работает.

  • Александр29 мая 2014 в 09:05 #

    Мда, я тоже не понял ничего, что куда вставлять, где что писать, пробывал писать в page.php. Можно ли более подробней описать куда вставлять php код. Или просто мне объяснить.....

    • Миша29 мая 2014 в 13:05 #

      первый код вставляем туда, где нужно вывести записи, все остальные коды - в functions.php

  • tislic31 мая 2014 в 01:05 #

    Привет! Я так понял, отключение повышенного приоритета для прилепленных записей, только в дополнительных циклах внутри страниц - это на странице когда было опубликовано сообщение, оно будет отображаться как обычное, так? Данный код не работает

    • Миша31 мая 2014 в 06:05 #

      Привет!
      Уверены? Может быть параметр ignore_sticky_posts для $query->set не робит. Попробуйте поменять его на другой, например на posts_per_page и посмотрите, произошли ли изменения?

      А вообще, перед публикацией на сайте я тестирую весь код.

  • tislic31 мая 2014 в 14:05 #

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

    Я хочу отключить отображение прилепленной записи, как прилепленное на 3, 4 и т.д. страницах. Я хочу, чтобы оно отображалось, как обычное, но выводилось на главную.

    Поменял на posts_per_page изменений нет! Код "Отключение повышенного приоритета на главной странице" и "Везде абсолютно" отключают вывод прилепленной записи перед всеми остальными на главной, но на своей странице сообщение помечено, как прилепленное.

    • Миша1 июня 2014 в 06:06 #

      Потому что код не применяется у вас к той странице, к которой вы хотите. Возможно цикл через WP_Query.

  • Narutoskee16 октября 2015 в 21:10 #

    Здравствуйте, а как сделать прикрепленную запись (Sticky Posts) для custom post type?

    • Миша17 октября 2015 в 07:10 #

      Добрый день!

      К сожалению WordPress не поддерживает пока это. Есть некоторые плагины, но на мой взгляд они не очень, поэтому лучше делать через произвольные поля вручную.

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Vladislav: Подправил имеющийся у меня код, по вашим рекомендациям, миниатюры начали отображаться, но они стали очень огромными, что...

  • Миша: Лишь предложил решение. Думаю можно нашаманить и так, чтобы чисто для рубрик было, не уверен только, что обойдётся без и...

  • Алексей: так надо комментарии в рубриках, а не на страницах в category.php а не в page.php

  • Миша: Здравствуйте! Сам WordPress это не поддерживает, но можно пойти хитрым путём. Первое, что пришло мне в голову, это:...

  • Алексей: Миша, здравствуйте! Подскажите, пожалуйста, что нужно, чтобы сделать комментарии на страницах рубрик. Я когда то давно...