Прилепленные записи (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;
}

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 17

Комментирование этого поста более не доступно.
  • Руслан 6 мая 2013 #

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

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

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

    • Миша 30 августа 2013 #

      если можно, то конкретнее пожалуйста

  • Александр 29 мая 2014 #

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

    • Миша 29 мая 2014 #

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

  • tislic 31 мая 2014 #

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

    • Миша 31 мая 2014 #

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

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

  • tislic 31 мая 2014 #

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

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

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

    • Миша 1 июня 2014 #

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

  • Narutoskee 16 октября 2015 #

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

    • Миша 17 октября 2015 #

      Добрый день!

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

      • narutoskee 19 октября 2015 #

        Спасибо. Я так и думал. Решил просто уточнить у профи. Отличный сайт, уже много лет пользуюсь.

        • Миша 19 октября 2015 #

          Спасибо 🙂 Рад, что мой сайт вам помогает.

  • Николай Бабьев 26 апреля 2020 #

    Здравствуйте! Я сейчас изучаю Ваш курс "Создание темы вордпресс"

    Столкнулся с такой проблемой: если в админке прилепить только 1 запись, то она не показывается большой. Более того, она и из маленьких пропадает.
    А если прилепить, например, 3 записи, то 2 последние будут показываться большими, а первая все равно нет.

    • Миша 26 апреля 2020 #

      Добрый день!

      То, что вы описываете, очень похоже на лишнее использование функции the_post() перед основным циклом.

      • Николай Бабьев 27 апреля 2020 #

        Действительно, почему-то стояла функция the_post() в самом начале, после get_header().
        Все заработало, спасибо большое!

      • Миша 27 апреля 2020 #

        Всегда пожалуйста! 🙃