Получение ссылок на предыдущую/следующую страницу (только URL, без <a> и заголовка)

8 июл. 2012 г., 21:11:30
Просмотры: 24.7K
Голосов: 8

В настоящее время я использую следующий метод для получения ссылки на предыдущую/следующую страницу блога:

<?php previous_post_link( '%link', '%title' ); ?>

Однако это включает внешний элемент, название и т.д., а мне нужна только ссылка, например http://domain.com/blog/page/2

Есть ли функция, которую я не заметил, соответствующая моим требованиям?

Уточнение

  • Это для следующей страницы блога (не поста блога)
  • Мне нужна только ссылка, без элемента якоря

Заранее спасибо

0
Все ответы на вопрос 6
1
19

Краткий ответ: вам нужна функция get_previous_posts_page_link:

<?php if($url = get_previous_posts_page_link()): ?>
  делаем что-то с $url
<?php endif; ?>

Развернутый ответ: следуем по коду.

previous_posts_link вызывает get_previous_posts_link.

<?php
/**
 * Отображает ссылку на предыдущую страницу записей.
 *
 * @since 0.71
 * @uses get_previous_posts_link()
 *
 * @param string $label Опционально. Текст ссылки на предыдущую страницу.
 */
function previous_posts_link( $label = null ) {
    echo get_previous_posts_link( $label );
}

get_previous_posts_link вызывает previous_posts для получения самого URI ссылки.

<?php
/**
 * Возвращает ссылку на предыдущую страницу записей.
 *
 * @since 2.7.0
 *
 * @param string $label Опционально. Текст ссылки на предыдущую страницу.
 * @return string|null
 */
function get_previous_posts_link( $label = null ) {
    global $paged;

    if ( null === $label )
        $label = __( '&laquo; Предыдущая Страница' );

    if ( !is_single() && $paged > 1 ) {
        $attr = apply_filters( 'previous_posts_link_attributes', '' );
        return '<a href="' . previous_posts( false ) . "\" $attr>". preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label ) .'</a>';
    }
}

previous_posts – это просто небольшая обертка вокруг искомой функции: get_previous_posts_page_link

<?php
/**
 * Отображает или возвращает ссылку на предыдущую страницу записей.
 *
 * @since 0.71
 *
 * @param boolean $echo Опционально. Выводить или возвращать;
 */
function previous_posts( $echo = true ) {
    $output = esc_url( get_previous_posts_page_link() );

    if ( $echo )
        echo $output;
    else
        return $output;
}

Искомая функция:

<?php
/**
 * Получает ссылку на предыдущую страницу записей.
 *
 * Возвращает строку только если это не одиночная страница или запись.
 *
 * Перенесена в 2.0.10 из 2.1.3.
 *
 * @since 2.0.10
 *
 * @return string|null
 */
function get_previous_posts_page_link() {
    global $paged;

    if ( !is_single() ) {
        $nextpage = intval($paged) - 1;
        if ( $nextpage < 1 )
            $nextpage = 1;
        return get_pagenum_link($nextpage);
    }
}

Я привел весь этот код, чтобы показать, как можно находить ответы, изучая ядро WordPress. Инструменты вроде ack могут помочь вам начать:

shell$ cd /path/to/your/wordpress/install
shell$ ack "function previous_posts_link"

В целом, WordPress довольно хорошо структурирован, и каждая функция выполняет только одну задачу. Прослеживание от более общих функций (например, previous_posts_link и других тегов шаблонов) к более базовым функциям обычно помогает узнать что-то новое и найти ответ.

8 июл. 2012 г. 22:00:30
Комментарии

Вау, очень информативный ответ, который работает даже спустя 5 лет, спасибо!

Davey Davey
4 июл. 2017 г. 19:40:44
1
<?php get_previous_posts_link(); ?>

Очевидно, вы сохраняете это в массив, например

<?php $prev = get_previous_posts_link(); ?>
8 июл. 2012 г. 21:31:59
Комментарии

Есть ли способ получить только ссылку, а не элемент <a href=""></a>?

Ben Everard Ben Everard
8 июл. 2012 г. 21:41:53
0

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

<?php
$pagelist = get_pages('sort_column=menu_order&sort_order=asc');
$pages = array();
foreach ($pagelist as $page) {
$pages[] += $page->ID;
}

$current = array_search($post->ID, $pages);
$prevID = $pages[$current-1];
$nextID = $pages[$current+1];
?>
8 июл. 2012 г. 21:37:29
1

Аналогично @liam-jay, но получаем только один из постов

$prev_post = get_previous_post();
empty($prev_post) or $link = $prev_post->guid;

Должно работать нормально, но не тестировалось.

8 июл. 2012 г. 21:49:39
Комментарии

GUID — это не ссылка. Он выглядит как ссылка, но таковой не является.

fuxia fuxia
8 июл. 2012 г. 23:13:01
0

это работает:

    <?php
    $next_post_url = get_permalink( get_adjacent_post(false,'',false)->ID );
    $previous_post_url = get_permalink( get_adjacent_post(false,'',true)->ID );        
    ?>
18 сент. 2019 г. 09:09:33
0

Для потомков. previous_posts() и next_posts() сделают именно это.

echo previous_posts( 0, false );
echo next_posts( 0, false );
13 янв. 2022 г. 19:05:07