Как в WordPress оставить посты определённых форматов в лентах, но скрыть упоминания таких постов в пагинации для single и page?
Есть сайт из коробки со стандартными постами и постами тех или иных форматов. Как, оставив все посты в лентах, убрать упоминания о постах форматов, как о single и page? Речь, в первую очередь, об устранении post-formats в пагинации.
(Вопрос устранения любых ссылок на посты в лентах, уже решён).
Дополнительно:
Ответы:
Для того чтобы скрыть упоминания постов определенных форматов в пагинации для страницы single и page в WordPress, вы можете использовать следующий код в файле functions.php вашей темы:
function exclude_post_formats_from_pagination($query) { if ($query->is_main_query() && ($query->is_single() || $query->is_page())) { $exclude_formats = array('aside', 'gallery'); // Укажите здесь форматы, которые нужно исключить $tax_query = array( array( 'taxonomy' => 'post_format', 'field' => 'slug', 'terms' => $exclude_formats, 'operator' => 'NOT IN' ) ); $query->set('tax_query', $tax_query); } } add_action('pre_get_posts', 'exclude_post_formats_from_pagination'); |
function exclude_post_formats_from_pagination($query) { if ($query->is_main_query() && ($query->is_single() || $query->is_page())) { $exclude_formats = array('aside', 'gallery'); // Укажите здесь форматы, которые нужно исключить $tax_query = array( array( 'taxonomy' => 'post_format', 'field' => 'slug', 'terms' => $exclude_formats, 'operator' => 'NOT IN' ) ); $query->set('tax_query', $tax_query); } } add_action('pre_get_posts', 'exclude_post_formats_from_pagination');
В этом коде мы используем хук `pre_get_posts` для изменения запроса постов на страницах single и page. Мы определяем массив `$exclude_formats`, содержащий форматы постов, которые нужно исключить из пагинации. Затем мы создаем `tax_query`, которая исключает посты с указанными форматами, и устанавливаем этот `tax_query` в запросе.
После добавления этого кода, посты с определенными форматами, указанными в массиве `$exclude_formats`, не будут учитываться в пагинации для страницы single и page в WordPress.
PS Спонсор ответа ChatGPT
- Виноват, но не срабатывает. Вижу что всё логично, но ссылка пагинации по-прежнему остаётся и, соответственно, отображение поста формата всё ещё присутствует. В чём может быть проблема?
- Шигаев., код шаблона + код пагинации в студию
- Предоставить код шаблона я затруднюсь — оперирую регистрацией форматов:
add_theme_support( 'post-formats', array( 'aside', 'gallery', 'chat', 'link', 'image', 'quote', 'status', 'video', 'audio' ) );
add_theme_support( 'post-formats', array( 'aside', 'gallery', 'chat', 'link', 'image', 'quote', 'status', 'video', 'audio' ) );
. Подскажите — что ещё нужно добавить и откуда скопировать. Что до кода пагинации, то я использую одну из его вариаций — «Kama Pagenavi»:
function kama_pagenavi( $args = [], $wp_query = null ){ // параметры по умолчанию $default = [ 'before' => '', // Текст до навигации. 'after' => '', // Текст после навигации. 'echo' => true, // Возвращать или выводить результат. 'text_num_page' => '', // Текст перед пагинацией. // {current} - текущая. // {last} - последняя (пр: 'Страница {current} из {last}' получим: "Страница 4 из 60"). 'num_pages' => 3, // Сколько ссылок показывать. 'step_link' => 100, // Ссылки с шагом (если 10, то: 1,2,3...10,20,30. Ставим 0, если такие ссылки не нужны. 'dotright_text' => '', // Промежуточный текст "до". 'dotright_text2' => '', // Промежуточный текст "после". 'back_text' => '<', // Текст "перейти на предыдущую страницу". Ставим 0, если эта ссылка не нужна. 'next_text' => '>', // Текст "перейти на следующую страницу". Ставим 0, если эта ссылка не нужна. 'first_page_text' => '|<', // Текст "к первой странице". Ставим 0, если вместо текста нужно показать номер страницы. 'last_page_text' => '>|', // Текст "к последней странице". Ставим 0, если вместо текста нужно показать номер страницы. ]; // Cовместимость с v2.5: kama_pagenavi( $before = '', $after = '', $echo = true, $args = array() ) $fargs = func_get_args(); if( $fargs && is_string( $fargs[0] ) ){ $default['before'] = isset($fargs[0]) ? $fargs[0] : ''; $default['after'] = isset($fargs[1]) ? $fargs[1] : ''; $default['echo'] = isset($fargs[2]) ? $fargs[2] : true; $args = isset($fargs[3]) ? $fargs[3] : array(); $wp_query = $GLOBALS['wp_query']; // после определения $default! } if( ! $wp_query ){ wp_reset_query(); global $wp_query; } if( ! $args ){ $args = []; } if( $args instanceof WP_Query ){ $wp_query = $args; $args = []; } /** * Позволяет установить параметры по умолчанию. * @param array $default_args */ $default = apply_filters( 'kama_pagenavi_args', $default ); $rg = (object) array_merge( $default, $args ); $paged = (int) $wp_query->get( 'paged' ) ?: 1; $max_page = $wp_query->max_num_pages; // navigation no needed if( $max_page < 2 ){ return ''; } $start_page = $paged - $half_page_start; // первая страница $end_page = $paged + $half_page_end; // последняя страница (условно) $pages_to_show = (int) $rg->num_pages; $pages_to_show_minus_1 = $pages_to_show-1; $half_page_start = floor( $pages_to_show_minus_1 / 2 ); // сколько ссылок до текущей страницы $half_page_end = ceil( $pages_to_show_minus_1 / 2 ); // сколько ссылок после текущей страницы if( $start_page <= 0 ){ $start_page = 1; } if( ( $end_page - $start_page ) != $pages_to_show_minus_1 ){ $end_page = $start_page + $pages_to_show_minus_1; } if( $end_page > $max_page ){ $start_page = $max_page - $pages_to_show_minus_1; $end_page = (int) $max_page; } if( $start_page <= 0 ){ $start_page = 1; } // создаём базу чтобы вызвать get_pagenum_link один раз $link_base = str_replace( PHP_INT_MAX, '___', get_pagenum_link( PHP_INT_MAX ) ); $first_url = get_pagenum_link( 1 ); if( false === strpos( $first_url, '?' ) ){ $first_url = user_trailingslashit( $first_url ); } // собираем елементы $els = []; if( $rg->text_num_page ){ $rg->text_num_page = preg_replace( '!{current}|{last}!', '%s', $rg->text_num_page ); $els['pages'] = sprintf( '<span class="pages">' . $rg->text_num_page . '</span>', $paged, $max_page ); } // в начало if( $start_page >= 2 && $pages_to_show < $max_page ){ $els['first'] = '<a class="first" href="' . $first_url . '">' . ( $rg->first_page_text ?: 1 ) . '</a>'; if( $rg->dotright_text && $start_page !== 2 ){ $els[] = '<span class="extend">' . $rg->dotright_text . '</span>'; } } // назад if( $rg->back_text && $paged !== 1 ){ $els['prev'] = '<a class="prev" href="' . ( ( $paged - 1 ) == 1 ? $first_url : str_replace( '___', ( $paged - 1 ), $link_base ) ) . '">' . $rg->back_text . '</a>'; } // пагинация for( $i = $start_page; $i <= $end_page; $i++ ){ if( $i === $paged ){ $els['current'] = '<span class="current">' . $i . '</span>'; } elseif( $i === 1 ){ $els[] = '<a href="' . $first_url . '">1</a>'; } else{ $els[] = '<a href="' . str_replace( '___', $i, $link_base ) . '">' . $i . '</a>'; } } // ссылки с шагом $dd = 0; if( $rg->step_link && $end_page < $max_page ){ for( $i = $end_page + 1; $i <= $max_page; $i++ ){ if( 0 === ( $i % $rg->step_link) && $i !== $rg->num_pages ){ if( ++$dd === 1 ){ $els[] = '<span class="extend">' . $rg->dotright_text2 . '</span>'; } $els[] = '<a href="' . str_replace( '___', $i, $link_base ) . '">' . $i . '</a>'; } } } // вперед if( $rg->next_text && $paged !== $end_page ){ $els['next'] = sprintf( '<a class="next" href="%s">%s</a>', str_replace( '___', ( $paged + 1 ), $link_base ), $rg->next_text ); } // в конец if( $end_page < $max_page ){ if( $rg->dotright_text && $end_page !== ( $max_page - 1 ) ){ $els[] = '<span class="extend">' . $rg->dotright_text2 . '</span>'; } $els['last'] = sprintf( '<a class="last" href="%s">%s</a>', str_replace( '___', $max_page, $link_base ), $rg->last_page_text ?: $max_page ); } /** * Allow to change pagenavi elements. * @param array $elements */ $els = apply_filters( 'kama_pagenavi_elements', $els ); $html = $rg->before . '<div class="wp-pagenavi">' . implode( '', $els ) . '</div>' . $rg->after; /** * Allow to change final output HTML code of pagenavi. * @param array $html */ $html = apply_filters( 'kama_pagenavi', $html ); if( ! $rg->echo ){ return $html; } echo $html; }
function kama_pagenavi( $args = [], $wp_query = null ){ // параметры по умолчанию $default = [ 'before' => '', // Текст до навигации. 'after' => '', // Текст после навигации. 'echo' => true, // Возвращать или выводить результат. 'text_num_page' => '', // Текст перед пагинацией. // {current} - текущая. // {last} - последняя (пр: 'Страница {current} из {last}' получим: "Страница 4 из 60"). 'num_pages' => 3, // Сколько ссылок показывать. 'step_link' => 100, // Ссылки с шагом (если 10, то: 1,2,3...10,20,30. Ставим 0, если такие ссылки не нужны. 'dotright_text' => '', // Промежуточный текст "до". 'dotright_text2' => '', // Промежуточный текст "после". 'back_text' => '<', // Текст "перейти на предыдущую страницу". Ставим 0, если эта ссылка не нужна. 'next_text' => '>', // Текст "перейти на следующую страницу". Ставим 0, если эта ссылка не нужна. 'first_page_text' => '|<', // Текст "к первой странице". Ставим 0, если вместо текста нужно показать номер страницы. 'last_page_text' => '>|', // Текст "к последней странице". Ставим 0, если вместо текста нужно показать номер страницы. ]; // Cовместимость с v2.5: kama_pagenavi( $before = '', $after = '', $echo = true, $args = array() ) $fargs = func_get_args(); if( $fargs && is_string( $fargs[0] ) ){ $default['before'] = isset($fargs[0]) ? $fargs[0] : ''; $default['after'] = isset($fargs[1]) ? $fargs[1] : ''; $default['echo'] = isset($fargs[2]) ? $fargs[2] : true; $args = isset($fargs[3]) ? $fargs[3] : array(); $wp_query = $GLOBALS['wp_query']; // после определения $default! } if( ! $wp_query ){ wp_reset_query(); global $wp_query; } if( ! $args ){ $args = []; } if( $args instanceof WP_Query ){ $wp_query = $args; $args = []; } /** * Позволяет установить параметры по умолчанию. * @param array $default_args */ $default = apply_filters( 'kama_pagenavi_args', $default ); $rg = (object) array_merge( $default, $args ); $paged = (int) $wp_query->get( 'paged' ) ?: 1; $max_page = $wp_query->max_num_pages; // navigation no needed if( $max_page < 2 ){ return ''; } $start_page = $paged - $half_page_start; // первая страница $end_page = $paged + $half_page_end; // последняя страница (условно) $pages_to_show = (int) $rg->num_pages; $pages_to_show_minus_1 = $pages_to_show-1; $half_page_start = floor( $pages_to_show_minus_1 / 2 ); // сколько ссылок до текущей страницы $half_page_end = ceil( $pages_to_show_minus_1 / 2 ); // сколько ссылок после текущей страницы if( $start_page <= 0 ){ $start_page = 1; } if( ( $end_page - $start_page ) != $pages_to_show_minus_1 ){ $end_page = $start_page + $pages_to_show_minus_1; } if( $end_page > $max_page ){ $start_page = $max_page - $pages_to_show_minus_1; $end_page = (int) $max_page; } if( $start_page <= 0 ){ $start_page = 1; } // создаём базу чтобы вызвать get_pagenum_link один раз $link_base = str_replace( PHP_INT_MAX, '___', get_pagenum_link( PHP_INT_MAX ) ); $first_url = get_pagenum_link( 1 ); if( false === strpos( $first_url, '?' ) ){ $first_url = user_trailingslashit( $first_url ); } // собираем елементы $els = []; if( $rg->text_num_page ){ $rg->text_num_page = preg_replace( '!{current}|{last}!', '%s', $rg->text_num_page ); $els['pages'] = sprintf( '<span class="pages">' . $rg->text_num_page . '</span>', $paged, $max_page ); } // в начало if( $start_page >= 2 && $pages_to_show < $max_page ){ $els['first'] = '<a class="first" href="' . $first_url . '">' . ( $rg->first_page_text ?: 1 ) . '</a>'; if( $rg->dotright_text && $start_page !== 2 ){ $els[] = '<span class="extend">' . $rg->dotright_text . '</span>'; } } // назад if( $rg->back_text && $paged !== 1 ){ $els['prev'] = '<a class="prev" href="' . ( ( $paged - 1 ) == 1 ? $first_url : str_replace( '___', ( $paged - 1 ), $link_base ) ) . '">' . $rg->back_text . '</a>'; } // пагинация for( $i = $start_page; $i <= $end_page; $i++ ){ if( $i === $paged ){ $els['current'] = '<span class="current">' . $i . '</span>'; } elseif( $i === 1 ){ $els[] = '<a href="' . $first_url . '">1</a>'; } else{ $els[] = '<a href="' . str_replace( '___', $i, $link_base ) . '">' . $i . '</a>'; } } // ссылки с шагом $dd = 0; if( $rg->step_link && $end_page < $max_page ){ for( $i = $end_page + 1; $i <= $max_page; $i++ ){ if( 0 === ( $i % $rg->step_link) && $i !== $rg->num_pages ){ if( ++$dd === 1 ){ $els[] = '<span class="extend">' . $rg->dotright_text2 . '</span>'; } $els[] = '<a href="' . str_replace( '___', $i, $link_base ) . '">' . $i . '</a>'; } } } // вперед if( $rg->next_text && $paged !== $end_page ){ $els['next'] = sprintf( '<a class="next" href="%s">%s</a>', str_replace( '___', ( $paged + 1 ), $link_base ), $rg->next_text ); } // в конец if( $end_page < $max_page ){ if( $rg->dotright_text && $end_page !== ( $max_page - 1 ) ){ $els[] = '<span class="extend">' . $rg->dotright_text2 . '</span>'; } $els['last'] = sprintf( '<a class="last" href="%s">%s</a>', str_replace( '___', $max_page, $link_base ), $rg->last_page_text ?: $max_page ); } /** * Allow to change pagenavi elements. * @param array $elements */ $els = apply_filters( 'kama_pagenavi_elements', $els ); $html = $rg->before . '<div class="wp-pagenavi">' . implode( '', $els ) . '</div>' . $rg->after; /** * Allow to change final output HTML code of pagenavi. * @param array $html */ $html = apply_filters( 'kama_pagenavi', $html ); if( ! $rg->echo ){ return $html; } echo $html; }
Вызов такой: <?php kama_pagenavi(); ?>
- Предположу, что в фильтре нужно использовать $query->is_archive() вместо $query->is_single() || $query->is_page()
Честно говоря не знаю зачем Кама писал эту функцию, потому что есть нативная the_posts_pagination()
- Артем Золин, к сожалению не срабатывает. Всё остаётся как было.
- Шигаев., нужна полная картина и по шаблону, узнать какой файл использует шаблон можно так
- Роман Страх, /template-parts/content
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <header class="entry-header"> <?php if ( is_singular() ) : the_title( '<h1 class="entry-title">', '</h1>' ); else : the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' ); endif; if ( 'post' === get_post_type() ) : ?> <div class="entry-meta"> <?php halo_halo_halo_posted_on(); halo_halo_halo_posted_by(); ?> </div><!-- .entry-meta --> <?php endif; ?> </header><!-- .entry-header --> <?php halo_halo_halo_post_thumbnail(); ?> <div class="entry-content"> <?php the_content( sprintf( wp_kses( /* translators: %s: Name of current post. Only visible to screen readers */ __( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'halo-halo-halo' ), array( 'span' => array( 'class' => array(), ), ) ), wp_kses_post( get_the_title() ) ) ); wp_link_pages( array( 'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'halo-halo-halo' ), 'after' => '</div>', ) ); ?> </div><!-- .entry-content --> <footer class="entry-footer"> <?php halo_halo_halo_entry_footer(); ?> </footer><!-- .entry-footer --> </article><!-- #post-<?php the_ID(); ?> -->
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <header class="entry-header"> <?php if ( is_singular() ) : the_title( '<h1 class="entry-title">', '</h1>' ); else : the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' ); endif; if ( 'post' === get_post_type() ) : ?> <div class="entry-meta"> <?php halo_halo_halo_posted_on(); halo_halo_halo_posted_by(); ?> </div><!-- .entry-meta --> <?php endif; ?> </header><!-- .entry-header --> <?php halo_halo_halo_post_thumbnail(); ?> <div class="entry-content"> <?php the_content( sprintf( wp_kses( /* translators: %s: Name of current post. Only visible to screen readers */ __( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'halo-halo-halo' ), array( 'span' => array( 'class' => array(), ), ) ), wp_kses_post( get_the_title() ) ) ); wp_link_pages( array( 'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'halo-halo-halo' ), 'after' => '</div>', ) ); ?> </div><!-- .entry-content --> <footer class="entry-footer"> <?php halo_halo_halo_entry_footer(); ?> </footer><!-- .entry-footer --> </article><!-- #post-<?php the_ID(); ?> -->
- Артем Золин, я и сам уже не помню — по какой причине выбрал пагинатор Тимура. Помню только, что выбирал из многих и его вроде бы был наиболее накиданный фишечками.
- Шигаев., попробуй переписать под the_posts_pagination()
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Если нужно оставить посты определённых форматов в лентах, но убрать их из навигации single/page, не трогайте главный запрос через
pre_get_postsдляis_single(). Пагинация внутри single часто строится функциямиprevious_post_link(),next_post_link()и соседними запросами, а не основным архивным запросом.Для соседних ссылок лучше использовать фильтры
get_previous_post_whereиget_next_post_where, либо вручную строить ссылки черезget_posts()с нужным исключением.Например, если нужно исключить формат
post-format-asideиз соседней навигации:add_filter('get_previous_post_where', 'exclude_formats_from_adjacent_post'); add_filter('get_next_post_where', 'exclude_formats_from_adjacent_post'); function exclude_formats_from_adjacent_post($where) { global $wpdb; $format = get_term_by('slug', 'post-format-aside', 'post_format'); if (!$format) { return $where; } $where .= $wpdb->prepare( " AND p.ID NOT IN ( SELECT tr.object_id FROM {$wpdb->term_relationships} tr INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'post_format' AND tt.term_id = %d )", $format->term_id ); return $where; }
Если форматов несколько, лучше собрать массив term_id и использовать
IN (...)через подготовленные значения. Но осторожно: такие фильтры влияют на все вызовы next/previous post links, где они применяются.Для page обычные post formats не применяются, если только у Вас не кастомная логика. Поэтому сначала уточните, где именно появляется нежелательная ссылка: в next/previous постах, хлебных крошках, пагинации архива, sitemap или блоке похожих записей. Для каждого места будет свой фильтр.
Итог: ленты не трогайте. Исключайте форматы именно в логике соседней навигации или в конкретном блоке, который выводит ссылки на single.