Прилепленные посты
Урок 7
Очень часто люди, столкнувшись с необходимостью вывести какую-то определенную запись на блоге перед всеми остальными, обращаются к фрилансерам (реальная история), не зная того, что такой функционал уже предусмотрен в WordPress по умолчанию.
В этом уроке покажу вам не только то, как сделать, чтобы одна или несколько записей в блоге выводились в начале, но и оформим их в другом стиле.
Чтобы скачать тему WordPress, которая получилась у нас в процессе этого урока, необходимо приобрести курс.
Пример:
Да, для того, чтобы всегда отображать первую запись вашего блога в таком формате, вы можете легко использовать переменную-счётчик в вашем цикле. Однако подобная запись хардкодит отображение первого поста в таком виде и человек, который будет использовать вашу тему:
Решение – прилепленные посты!
На странице редактирования записей (а также в быстром редактировании) есть такая офигенная галочка, которая и позволяет вам управлять прилепленными записями на блоге!
Отмечаете эту галочку и:
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().
То есть в этом случае все записи будут выводиться как обычно — с сортировкой по дате. Для этого воспользуемся хуком pre_get_posts.
На главной странице:
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 ); }
В этом вам поможет функция post_class(), потому что она добавляет для всех прилепленных постов класс sticky
(но только на главной странице).
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
После этого в CSS можно добавить что-нибудь в этом духе:
.sticky { color:#fe0000; }
Подробнее – в видеоуроке.
Список уроков