Intereting Posts
Как создать WP_Query, который возвращает сообщения, где один meta_value <= другой meta_value WP Query для установки миниатюры для существующих старых сообщений Есть ли более простой способ сделать это? Отключить «предыдущую ссылку» в первом сообщении и «следующую ссылку» в последнем сообщении Страницы с 2 колонками Перемещение сервера: все страницы, ведущие домой Как показать разные боковые панели на конкретных страницах? Не удалось получить Предварительный просмотр загруженного изображения в пользовательском мета-окне WordPress Media Library показывает неправильный размер предварительного просмотра? Как удалить сиротские вложения? как добавить дополнительный мета-ящик или текстовое поле в настраиваемые типы сообщений BP Результаты поиска не будут отображаться на странице профиля пользователя Пользовательские параметры URL в файлах шаблонов Индекс блога не будет в папке WordPress PHP Неустранимая ошибка: вызов неопределенной функции wp_cache_get () в /var/www/vhosts/visisite.com/httpdocs/wp-includes/functions.php в строке 1367

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

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

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-## -->