Поддержка Проблемы и решения Страницы пагинаций

  • Подскажите, пожалуйста, страницы пагинации формируются с урлами
    /page/2/
    /page/3/

    Можно ли их поправить на /page-2/ или ?page=2
    Где формируются данные урлы?

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • kul86, приветствую.

    Можно ли их поправить на /page-2/ или ?page=2

    Зависит от того, как у вас реализована пагинация вообще, но можете посмотреть варианты с аргументом «format» функции «wp_link_pages».

    Добрый день, спасибо, что откликнулись, функция описана стандартно:

    function wp_link_pages( $args = '' ) {
    	global $page, $numpages, $multipage, $more;
    
    	$defaults = array(
    		'before'           => '<p>' . __( 'Pages:' ),
    		'after'            => '</p>',
    		'link_before'      => '',
    		'link_after'       => '',
    		'next_or_number'   => 'number',
    		'separator'        => ' ',
    		'nextpagelink'     => __( 'Next page' ),
    		'previouspagelink' => __( 'Previous page' ),
    		'pagelink'         => '%',
    		'echo'             => 1
    	);
    
    	$params = wp_parse_args( $args, $defaults );
    
    	/**
    	 * Filters the arguments used in retrieving page links for paginated posts.
    	 *
    	 * @since 3.0.0
    	 *
    	 * @param array $params An array of arguments for page links for paginated posts.
    	 */
    	$r = apply_filters( 'wp_link_pages_args', $params );
    
    	$output = '';
    	if ( $multipage ) {
    		if ( 'number' == $r['next_or_number'] ) {
    			$output .= $r['before'];
    			for ( $i = 1; $i <= $numpages; $i++ ) {
    				$link = $r['link_before'] . str_replace( '%', $i, $r['pagelink'] ) . $r['link_after'];
    				if ( $i != $page || ! $more && 1 == $page ) {
    					$link = _wp_link_page( $i ) . $link . '</a>';
    				}
    				/**
    				 * Filters the HTML output of individual page number links.
    				 *
    				 * @since 3.6.0
    				 *
    				 * @param string $link The page number HTML output.
    				 * @param int    $i    Page number for paginated posts' page links.
    				 */
    				$link = apply_filters( 'wp_link_pages_link', $link, $i );
    
    				// Use the custom links separator beginning with the second link.
    				$output .= ( 1 === $i ) ? ' ' : $r['separator'];
    				$output .= $link;
    			}
    			$output .= $r['after'];
    		} elseif ( $more ) {
    			$output .= $r['before'];
    			$prev = $page - 1;
    			if ( $prev > 0 ) {
    				$link = _wp_link_page( $prev ) . $r['link_before'] . $r['previouspagelink'] . $r['link_after'] . '</a>';
    
    				/** This filter is documented in wp-includes/post-template.php */
    				$output .= apply_filters( 'wp_link_pages_link', $link, $prev );
    			}
    			$next = $page + 1;
    			if ( $next <= $numpages ) {
    				if ( $prev ) {
    					$output .= $r['separator'];
    				}
    				$link = _wp_link_page( $next ) . $r['link_before'] . $r['nextpagelink'] . $r['link_after'] . '</a>';
    
    				/** This filter is documented in wp-includes/post-template.php */
    				$output .= apply_filters( 'wp_link_pages_link', $link, $next );
    			}
    			$output .= $r['after'];
    		}
    	}
    
    	/**
    	 * Filters the HTML output of page links for paginated posts.
    	 *
    	 * @since 3.6.0
    	 *
    	 * @param string $output HTML output of paginated posts' page links.
    	 * @param array  $args   An array of arguments.
    	 */
    	$html = apply_filters( 'wp_link_pages', $output, $args );
    
    	if ( $r['echo'] ) {
    		echo $html;
    	}
    	return $html;
    }
    
    /**
     * Helper function for wp_link_pages().
     *
     * @since 3.1.0
     * @access private
     *
     * @global WP_Rewrite $wp_rewrite
     *
     * @param int $i Page number.
     * @return string Link.
     */
    function _wp_link_page( $i ) {
    	global $wp_rewrite;
    	$post = get_post();
    	$query_args = array();
    
    	if ( 1 == $i ) {
    		$url = get_permalink();
    	} else {
    		if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) )
    			$url = add_query_arg( 'page', $i, get_permalink() );
    		elseif ( 'page' == get_option('show_on_front') && get_option('page_on_front') == $post->ID )
    			$url = trailingslashit(get_permalink()) . user_trailingslashit("$wp_rewrite->pagination_base/" . $i, 'single_paged');
    		else
    			$url = trailingslashit(get_permalink()) . user_trailingslashit($i, 'single_paged');
    	}
    
    	if ( is_preview() ) {
    
    		if ( ( 'draft' !== $post->post_status ) && isset( $_GET['preview_id'], $_GET['preview_nonce'] ) ) {
    			$query_args['preview_id'] = wp_unslash( $_GET['preview_id'] );
    			$query_args['preview_nonce'] = wp_unslash( $_GET['preview_nonce'] );
    		}
    
    		$url = get_preview_post_link( $post, $query_args, $url );
    	}
    
    	return '<a href="' . esc_url( $url ) . '">';
    }

    Не вижу в ней аргумента «format» и не могу понять, как поправить формирование урлов у данных страниц.

    kul86, добрый 🙂 Извиняюсь, ошибся. Вот точнее информация:

    https://codex.wordpress.org/Function_Reference/paginate_links

    <?php $args = array(
    	'base'               => '%_%',
    	'format'             => '?paged=%#%',    <<== format
    	'total'              => 1,
    	'current'            => 0,
    	'show_all'           => false,
    	'end_size'           => 1,
    	'mid_size'           => 2,
    	'prev_next'          => true,
    	'prev_text'          => __('« Previous'),
    	'next_text'          => __('Next »'),
    	'type'               => 'plain',
    	'add_args'           => false,
    	'add_fragment'       => '',
    	'before_page_number' => '',
    	'after_page_number'  => ''
    ); ?>

    Не работает, поменял, но вообще ничего не изменилось.

    Если смотреть код, то подключается именно функция wp_pagenavi
    Но ее нигде не могу найти, в поисковиках выдается, что это типа плагин, но плагинов пагинации я не ставил.

    kul86, у WordPress есть «из коробки» своя пагинация, ее можно или кастомизировать, или заменить плагином.

    Не работает, поменял, но вообще ничего не изменилось.

    Оно и не должно, я вам направление мысли указываю) Так-то надо конкретно вашу ситуацию рассматривать, где что подключается/выводится и как.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Можно ли их поправить на /page-2/ или ?page=2

    Какова конечная цель такой замены?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Возможно, будет полезна тема «Как сменить структуру pagination».

    Сергей, по поводу цели, возможно это мои заморочки, но
    1) Если оставить URL /page/2/, то получается по структуре, что имеется лишний уровень вложенности или страница /page/ должна открываться и что то выдавать в итоге. С точки зрения SEO какая то корявая структура получается;
    2) URL в таком виде просто не нравится;
    3) Чисто спортивный интерес уже, в том можно ли сменить или нет.

    По Вашему коду из темы по ссылке, всё работает, но URL преобразуются в вид
    /page2/
    /page3/

    Опять же из-за «красоты» хочется
    /page-2/
    /page-3/

    Понимаю, где заменить «page» на «page-» в коде (3 строка):

    function my_paged_links($string, $type_of_url) {
    	if ( $type_of_url == 'paged') {
    		$string = str_replace('page/', 'page-', $string);
    	}
    	return $string;
    }
    add_filter('user_trailingslashit', 'my_paged_links', 10, 2);
    
    function my_pagenum_link($link) {
    	if ( $_SERVER['REQUEST_URI'] != '/' ) {
    		preg_match('/\/page[0-9]+/', $_SERVER['REQUEST_URI'], $matches);
    		if ( !empty($matches) ) {
    			$link = str_replace($matches[0], '', $link);
    		}
    	}
    	return $link;
    }
    add_filter('get_pagenum_link', 'my_pagenum_link');

    Тогда ссылки в пагинации преобразуются в правильные:
    /page-2/
    /page-3/
    Но сами страницы остаются с урлами:
    /page2/
    /page3/

    Можно конечно в .htaccess добавить редиректы, но, я так понимаю, и сам код можно как то поправить, чтобы урлы страниц преобразовались, но не могу понять, что именно поправить… Не подскажите? Спасибо!!!

    • Ответ изменён 4 года, 11 месяцев назад пользователем kul86.
    • Ответ изменён 4 года, 11 месяцев назад пользователем kul86.
Просмотр 9 ответов — с 1 по 9 (всего 9)
  • Тема «Страницы пагинаций» закрыта для новых ответов.