Как в WordPress оставить посты определённых форматов в лентах, но скрыть упоминания таких постов в пагинации для single и page?

Ссылка скопирована
1 ответ

Есть сайт из коробки со стандартными постами и постами тех или иных форматов. Как, оставив все посты в лентах, убрать упоминания о постах форматов, как о 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
    &lt;article id="post-&lt;?php the_ID(); ?&gt;" &lt;?php post_class(); ?&gt;&gt; 	&lt;header class="entry-header"&gt; 		&lt;?php 		if ( is_singular() ) : 			the_title( '&lt;h1 class="entry-title"&gt;', '&lt;/h1&gt;' ); 		else : 			the_title( '&lt;h2 class="entry-title"&gt;&lt;a href="' . esc_url( get_permalink() ) . '" rel="bookmark"&gt;', '&lt;/a&gt;&lt;/h2&gt;' ); 		endif;  		if ( 'post' === get_post_type() ) : 			?&gt; 			&lt;div class="entry-meta"&gt; 				&lt;?php 				halo_halo_halo_posted_on(); 				halo_halo_halo_posted_by(); 				?&gt; 			&lt;/div&gt;&lt;!-- .entry-meta --&gt; 		&lt;?php endif; ?&gt; 	&lt;/header&gt;&lt;!-- .entry-header --&gt;  	&lt;?php halo_halo_halo_post_thumbnail(); ?&gt;  	&lt;div class="entry-content"&gt; 		&lt;?php 		the_content( 			sprintf( 				wp_kses( 					/* translators: %s: Name of current post. Only visible to screen readers */ 					__( 'Continue reading&lt;span class="screen-reader-text"&gt; "%s"&lt;/span&gt;', 'halo-halo-halo' ), 					array( 						'span' =&gt; array( 							'class' =&gt; array(), 						), 					) 				), 				wp_kses_post( get_the_title() ) 			) 		);  		wp_link_pages( 			array( 				'before' =&gt; '&lt;div class="page-links"&gt;' . esc_html__( 'Pages:', 'halo-halo-halo' ), 				'after'  =&gt; '&lt;/div&gt;', 			) 		); 		?&gt; 	&lt;/div&gt;&lt;!-- .entry-content --&gt;  	&lt;footer class="entry-footer"&gt; 		&lt;?php halo_halo_halo_entry_footer(); ?&gt; 		 	&lt;/footer&gt;&lt;!-- .entry-footer --&gt;	  &lt;/article&gt;&lt;!-- #post-&lt;?php the_ID(); ?&gt; --&gt;

    &lt;article id="post-&lt;?php the_ID(); ?&gt;" &lt;?php post_class(); ?&gt;&gt; &lt;header class="entry-header"&gt; &lt;?php if ( is_singular() ) : the_title( '&lt;h1 class="entry-title"&gt;', '&lt;/h1&gt;' ); else : the_title( '&lt;h2 class="entry-title"&gt;&lt;a href="' . esc_url( get_permalink() ) . '" rel="bookmark"&gt;', '&lt;/a&gt;&lt;/h2&gt;' ); endif; if ( 'post' === get_post_type() ) : ?&gt; &lt;div class="entry-meta"&gt; &lt;?php halo_halo_halo_posted_on(); halo_halo_halo_posted_by(); ?&gt; &lt;/div&gt;&lt;!-- .entry-meta --&gt; &lt;?php endif; ?&gt; &lt;/header&gt;&lt;!-- .entry-header --&gt; &lt;?php halo_halo_halo_post_thumbnail(); ?&gt; &lt;div class="entry-content"&gt; &lt;?php the_content( sprintf( wp_kses( /* translators: %s: Name of current post. Only visible to screen readers */ __( 'Continue reading&lt;span class="screen-reader-text"&gt; "%s"&lt;/span&gt;', 'halo-halo-halo' ), array( 'span' =&gt; array( 'class' =&gt; array(), ), ) ), wp_kses_post( get_the_title() ) ) ); wp_link_pages( array( 'before' =&gt; '&lt;div class="page-links"&gt;' . esc_html__( 'Pages:', 'halo-halo-halo' ), 'after' =&gt; '&lt;/div&gt;', ) ); ?&gt; &lt;/div&gt;&lt;!-- .entry-content --&gt; &lt;footer class="entry-footer"&gt; &lt;?php halo_halo_halo_entry_footer(); ?&gt; &lt;/footer&gt;&lt;!-- .entry-footer --&gt; &lt;/article&gt;&lt;!-- #post-&lt;?php the_ID(); ?&gt; --&gt;

  • Артем Золин, я и сам уже не помню — по какой причине выбрал пагинатор Тимура. Помню только, что выбирал из многих и его вроде бы был наиболее накиданный фишечками.
  • Шигаев., попробуй переписать под the_posts_pagination()
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Стас DB Ответ

Если нужно оставить посты определённых форматов в лентах, но убрать их из навигации 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-&gt;prepare(
        " AND p.ID NOT IN (
            SELECT tr.object_id
            FROM {$wpdb-&gt;term_relationships} tr
            INNER JOIN {$wpdb-&gt;term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
            WHERE tt.taxonomy = 'post_format' AND tt.term_id = %d
        )",
        $format-&gt;term_id
    );
 
    return $where;
}

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-&gt;prepare( " AND p.ID NOT IN ( SELECT tr.object_id FROM {$wpdb-&gt;term_relationships} tr INNER JOIN {$wpdb-&gt;term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'post_format' AND tt.term_id = %d )", $format-&gt;term_id ); return $where; }

Если форматов несколько, лучше собрать массив term_id и использовать IN (...) через подготовленные значения. Но осторожно: такие фильтры влияют на все вызовы next/previous post links, где они применяются.

Для page обычные post formats не применяются, если только у Вас не кастомная логика. Поэтому сначала уточните, где именно появляется нежелательная ссылка: в next/previous постах, хлебных крошках, пагинации архива, sitemap или блоке похожих записей. Для каждого места будет свой фильтр.

Итог: ленты не трогайте. Исключайте форматы именно в логике соседней навигации или в конкретном блоке, который выводит ссылки на single.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно