Будем прикреплять посты к категориям.
В wordpress по умолчанию существует возможность прикрепить записи, однако они прикрепляются только к главной странице.
Мы же уберем прикрепление у главной страницы и закрепим у категорий.
Есть множество способов изменить query запрос, который и формирует вывод постов. Мы будем использовать один из вариантов.
1. Уберем прикрепленные посты с главной страницы
$args = [
// Игнорирует прикрепленные посты и показывает их в общем потоке
'ignore_sticky_posts' => 1
];
global $wp_query;
query_posts(
array_merge(
$wp_query->query,
$args
)
);
Этот код нужно поместить в index.php перед кодом:
2. Закрепим прикрепленные посты в категориях
Теперь в шаблоне категорий, обычно это страница archive.php, вместо кода:
else :
endif;
добавим следующий код:
* Первый LOOP с прикрепленными постами
*/
// Определяем прикрепленные посты
$sticky = get_option('sticky_posts');
// Формируем запрос
$args = [
'post__in' => $sticky,
];
// Добавляем в запрос
global $wp_query;
query_posts(
array_merge(
$wp_query->query,
$args
)
);
while ($wp_query->have_posts()) : $wp_query->the_post();
get_template_part('/add/archive/article');
endwhile;
wp_reset_query();
/**
* Второй LOOP без прикрепленных постов
*/
// Формируем запрос
$args = [
'post__not_in' => $sticky
];
// Добавляем в запрос
global $wp_query;
query_posts(
array_merge(
$wp_query->query,
$args
)
);
while ($wp_query->have_posts()) : $wp_query->the_post();
get_template_part('/add/archive/article');
endwhile;
// Добавим навигацию
if (have_posts()) {
get_template_part('/add/archive/navigation');
}
3. Добавим уникальности заголовку
Перед заголовком такой новости добавим код:
$sticky = get_option('sticky_posts');
$stickyText = '';
if (in_array(get_the_ID(), $sticky, true) &&
(!is_home() || !is_front_page())
) {
$stickyText = 'Прикреплено';
}
// Отображаем запланированные записи и черновики
if (current_user_can('activate_plugins')) {
$postStatus = get_post_status();
if ($postStatus === 'draft') {
echo 'Черновик';
} elseif ($postStatus === 'future') {
echo 'Запланировано';
} elseif ($sticky) {
echo $stickyText;
}
}
Вот и все. В коде выше есть также отметки «Черновик» и «Запланировано». Все это также можно добавить внутрь текущего query запроса. Как это сделать можно узнать из этой статьи.