Intereting Posts
Изменение html lang в зависимости от автора Кэш страниц для категорий, не обновляемых с помощью W3 Total Cache прекратить красивую разбивку по страницам сайта site.com/cat/2 => site.com/cat?page=2 Какие действия влияют на файлы, DB или оба? Выбор и вывод результатов из БД с помощью массива Добавить опцию в строитель Лучший способ упорядочить пользовательские типы сообщений по атрибутам -> Заказать значение метаболизма? Почему визуальный редактор tinymce показывает фон из моей темы Скрыть администраторов из списка пользователей, кроме текущего пользователя (администратора) как создать страницу wordpress с помощью php и mysql Добавление внешней таблицы стилей после ВСЕХ других стилей Пользовательский шаблон шаблона типа публикации Как проверить, существует ли файл шаблона WordPress? Можно ли переопределить wp_password_change_notification в плагине mu? Таблица WordPress MU wp_posts

Важные сообщения на домашней странице, поиск, теги и архивы без плагина

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

function wpb_latest_sticky() { /* Get all sticky posts */ $sticky = get_option( 'sticky_posts' ); /* Sort the stickies with the newest ones at the top */ rsort( $sticky ); /* Get the 5 newest stickies (change 5 for a different number) */ $sticky = array_slice( $sticky, 0, 5 ); /* Query sticky posts */ $the_query = new WP_Query( array( 'post__in' => $sticky, 'ignore_sticky_posts' => 1 ) ); // The Loop if ( $the_query->have_posts() ) { $return .= '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); $return .= '<li><a href="' .get_permalink(). '" title="' . get_the_title() . '">' . get_the_title() . '</a><br />' . get_the_excerpt(). '</li>'; } $return .= '</ul>'; } else { // no posts found } /* Restore original Post Data */ wp_reset_postdata(); return $return; } add_shortcode('latest_stickies', 'wpb_latest_sticky'); 

Я думал, чтобы липкий пост отображался в поиске, теге и категории.

Любое решение? Благодаря!

Solutions Collecting From Web of "Важные сообщения на домашней странице, поиск, теги и архивы без плагина"

Этот же точный вопрос был задан ранее на этой неделе или в выходные, и это заставило меня задуматься. Вот идея, с которой я столкнулся.

Если вы посмотрите на исходный код класса WP_Query , вы увидите, что липкие сообщения добавляются только на первую страницу домашней страницы. Также нет фильтра, чтобы изменить это поведение, чтобы установить необходимые шаблоны по своему вкусу.

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

ВОТ КАК:

  • Получите идентификатор сообщения, сохраненный как липкие сообщения с get_option( 'sticky_posts' )

  • Удалите эти сообщения из основного запроса с помощью pre_get_posts . Поскольку листы включены на домашней странице, мы исключаем домашнюю страницу. Мы также исключим нормальные страницы

  • Внутри настраиваемой функции запустите пользовательский запрос с помощью get_posts чтобы сообщения были установлены как липкие сообщения.

  • Объединить возвращенный массив липких сообщений с текущими возвращенными сообщениями основного запроса с помощью array_merge

  • the_posts эту настраиваемую функцию к фильтру the_posts

Вот код: ( Требуется PHP 5.4+ )

 add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() && $q->is_main_query() && !$q->is_home() && !$q->is_page() ) { $q->set( 'post__not_in', get_option( 'sticky_posts' ) ); if ( !$q->is_paged() ) { add_filter( 'the_posts', function ( $posts ) { $stickies = get_posts( ['post__in' => get_option( 'sticky_posts' ), 'nopaging' => true] ); $posts = array_merge( $stickies, $posts ); return $posts; }, 10, 2); } } }); 

Ответ Pieter действительно работает, но он отображает все липкие сообщения даже на страницах, когда мы хотим отображать отфильтрованные сообщения (например, для определенной категории).

Для меня работает следующее. Добавление этого в functions.php отображает только листы в подмножестве отфильтрованных сообщений:

 add_filter('the_posts', 'bump_sticky_posts_to_top'); function bump_sticky_posts_to_top($posts) { $stickies = array(); foreach($posts as $i => $post) { if(is_sticky($post->ID)) { $stickies[] = $post; unset($posts[$i]); } } return array_merge($stickies, $posts); не add_filter('the_posts', 'bump_sticky_posts_to_top'); function bump_sticky_posts_to_top($posts) { $stickies = array(); foreach($posts as $i => $post) { if(is_sticky($post->ID)) { $stickies[] = $post; unset($posts[$i]); } } return array_merge($stickies, $posts); 

(Кредиты: http://pastebin.com/Y5jVrKg4 , с небольшими изменениями, чтобы предотвратить предупреждение: array_merge () [function.array-merge]: Аргумент # 1 не является массивом при ошибке строки 9 )

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

Было бы неплохо также использовать систему, которая установила класс .sticky CSS для липких сообщений.

Мне нужны были некоторые изменения (оригинал см. В Pieters), чтобы заставить его работать только на страницах категорий. Это решение отобразит все липкие сообщения текущей категории (и дочерних категорий), но не на поиск, тег и отдельные страницы:

 add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() && $q->is_main_query() && !$q->is_home() && !$q->is_tag() && !$q->is_search() && !$q->is_page() && !$q->is_single() ) { function is_existing_cat($q_catName) { $existingCats = get_categories(); $isExistingCat = false; foreach ($existingCats as $cat) { if ($cat->name == $q_catName) { $isExistingCat = true; } } return $isExistingCat; } if ($q->is_category() && !$q->is_paged() && is_existing_cat($q->query['category_name'])) { $q->set( 'post__not_in', get_option( 'sticky_posts' ) ); add_filter( 'the_posts', function ( $posts ) { $catName = get_category(get_query_var('cat'))->name; $catID = get_cat_ID($catName); if ( !empty(get_option( 'sticky_posts' )) ) { $stickies = get_posts( [ 'category' => $catID, 'post__in' => get_option( 'sticky_posts' ) ] ); $posts = array_merge( $stickies, $posts ); } return $posts; }, 10, 2); } } }); 

Я добавил функцию, чтобы проверить, является ли категория существующей категорией, потому что я столкнулся с проблемой, что я был направлен в категорию.php вместо ожидаемого 404.php. Ссылки, подобные /existing-cat/not-existing-post работали, но ссылки вроде /not-existing-post-or-page-or-cat не поддерживались.

Если вам нужен класс css на этом посту, вы добавляете этот код в часть PHP шаблона, которая отображает содержимое сообщения (например, в twentysixteen: template-parts / content.php)

 <?php if (is_sticky()) { $stickyClass = 'sticky'; } else { $stickyClass = ''; } ?> 

Чем вы добавляете этот класс в классы css post post_class($stickyClass); (эта функция добавит атрибут класса к элементу HTML с несколькими классами и вашим добавленным классом). Вы можете найти эту функцию уже в статье:

 <article id="post-<?php the_ID(); ?>" <?php post_class($stickyClass); ?>> ... </article><!-- #post-## -->