Получить текущий URL (постоянная ссылка) без / page / {pagenum} /

11

Как я могу получить текущий URL (будь Стартовой, архив, архив почтового типа, категории архив и т.д.) , но всегда без в /page/{pagenum}/части , если он присутствует? Итак, если реальный URL-адрес:

example.com/category/uncategorized/

ИЛИ

example.com/category/uncategorized/page/2/

тогда возвращаемое значение всегда будет

example.com/category/uncategorized/

Игорь Воротнов
источник

Ответы:

12

Вы можете получить текущий URL через home_url( $wp->request ).

Попробуйте пример ниже:

global $wp;

// get current url with query string.
$current_url =  home_url( $wp->request ); 

// get the position where '/page.. ' text start.
$pos = strpos($current_url , '/page');

// remove string from the specific postion
$finalurl = substr($current_url,0,$pos);


echo $finalurl;
Говинд Кумар
источник
Это сработало! Хотя он ничего не возвращал, если в URL не было / page / X /, поэтому я немного изменил его, чтобы сделать его универсальным. Большое спасибо!
Игорь Воротнов
7

Ответ от Говинда Кумара сработал, однако он возвращал URL-адрес только в том случае, если / page / {pagenum} / присутствовал в URL-адресе, и ничего не возвращал, если нет. Мне нужно было универсальное решение, которое всегда будет возвращать базовый URL без разбиения на страницы, поэтому я немного изменил код Говинда и обернулся в функцию:

function get_nopaging_url() {

    global $wp;

    $current_url =  home_url( $wp->request );
    $position = strpos( $current_url , '/page' );
    $nopaging_url = ( $position ) ? substr( $current_url, 0, $position ) : $current_url;

    return trailingslashit( $nopaging_url );

}

echo get_nopaging_url();

Теперь он всегда возвращает правильный URL.

( Это полезно, если вам нужно реализовать какие-то фильтры постов, которые добавляют параметр для фильтрации постов, скажем, по метафайлам. Поэтому, даже если пользователь устанавливает параметр фильтра на странице X, новые отфильтрованные результаты всегда будут начните с базового URL-адреса, а не со страницы X, и добавьте 404, если количество отфильтрованных сообщений меньше. )

Игорь Воротнов
источник
Отлично. Очень близко. Но «/ page» недостаточно строг. Например, page-me.com вернет значение; значение, которое неверно.
Главный алхимик
Хороший вопрос @ChiefAlchemist, даже не думал о /pageподстроке, являющейся частью доменного имени (если www, конечно, не используется). Это, скорее, скорее крайний случай. Однако я бы посоветовал вам внести свой вклад, добавив код, который будет охватывать и этот случай.
Игорь Воротнов
Воротбов - Сделаем. Пожалуйста, смотрите ниже. Между прочим, есть много слов с подстрокой «page». Я не думаю, что можно предположить, что это крайний случай. Лучше всего сделать это как можно крепче. Меньше беспокойства в долгосрочной перспективе.
Главный алхимик
Да, но, хотя я согласен с вами в целом, вопрос был конкретной проблемой, и он был решен наиболее эффективным способом для конкретного случая. Если в моем домене нет этой подстроки, тогда мне просто не нужно использовать какие-либо регулярные выражения, которые медленнее, чем простой substr (и который отлично работает в моем случае). Это не публичный плагин или тема, поэтому мне не нужно покрывать все возможные крайние случаи. Тем не менее, ваше дополнение ценится, и надежда может помочь некоторым будущим разработчикам. Спасибо!
Игорь Воротнов
5

На самом деле проще всего было бы использовать, get_pagenum_link()который вернет вам текущий URL без каких-либо параметров /page/*.


бонус

Вы также можете просто использовать его для динамического построения ссылок «Предыдущая» и «Следующая» с помощью 'paged'переменной запроса:

// Get the current page number.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$first_page = '<a href="' . get_pagenum_link() . '" class="page-first"><<</a>';
$prev_page = '<a href="' . get_pagenum_link($paged - 1) . '" class="page-prev"><</a>';
$next_page = '<a href="' . get_pagenum_link($paged + 1) . ' class="page-next">></a>';

// And having a `WP_Query` object you can also build the link for the last page:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';
leymannx
источник
3

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

function get_nopaging_url() {
    $current_url =  $_SERVER[REQUEST_URI];

    $pattern = '/page\\/[0-9]+\\//i';
    $nopaging_url = preg_replace($pattern, '', $current_url);

    return  $nopaging_url;
}
Lorenzo
источник
0

Если вы хотите удалить все возможные комбинации нумерации страниц, используйте этот фрагмент:

// remove pagination from url
$pattern = '/page(\/)*([0-9\/])*/i';
$url = preg_replace($pattern, '', $GLOBALS['wp']->request);

Это позаботится о

/page
/page/
/page/1
/page/1/
...

и нечувствителен к регистру, работает для любого номера страницы нумерации страниц, а также удалит любую комбинацию конечного номера / номера / номера ... (тесты здесь: https://regex101.com/r/9fQaLC/1 )

Если вы хотите получить полный URL с ведущими http (s), просто добавьте

$url = home_url($url);

В этой строке вы также можете добавить любой пользовательский параметр GET, например, так

$url = home_url($url . '?typ=test');
Larzan
источник
1
Лично я всегда стараюсь избегать регулярных выражений, если что-то можно сделать без них (и при этом оставаться достаточно простым). Кроме того, add_query_arg () следует использовать для добавления параметров GET вместо конкатенации строк. Но сам ответ правильный и делает свою работу, спасибо.
Игорь Воротнов,
-1

Хотя этот вопрос уже ответили здесь (не принято), этот фрагмент должен сделать трюк: home_url(add_query_arg(NULL, NULL));.

Фабианский марз
источник
Я попробовал этот трюк, не работает. Выход по-прежнему имеет / страницу / 2 / добавлено.
Игорь Воротнов
Извините, я понял, что вы хотите получить полный URL, но не получилось, потому что он всегда возвращал URL без page/{pagenum}.
Фабианский марз
-1
trait TraitURLStrip {

    /**
     * Strips off paging and query string. Returns a filter-the-results friendly URL
     *
     * @param bool   $str_url
     * @param string $str_page
     *
     * @return bool|string
     */
    protected function urlStrip( $str_url = false , $str_page = 'page' ){

        if ( is_string( $str_url) ) {

            $arr_parse_url = wp_parse_url( $str_url );

            $str_path_no_page = '';
            if ( isset( $arr_parse_url['path'] ) ) {

                // if we're paging then remove that. please!
                $str_path_no_page = preg_replace( "/\/{$str_page}\/[0-9]*\/$/", "/", $arr_parse_url['path'] );

            }

            $str_scheme_host = "{$arr_parse_url['scheme']}://{$arr_parse_url['host']}";

            return $str_scheme_host . $str_path_no_page;
        }
        return false;
    }
}
Главный алхимик
источник
Могу я спросить, почему вы возвращаете false, если $ str_url не является строкой? Если вы случайно (что не должно произойти) передать что-то еще, вы уничтожаете данные. Я полагаю, что возвращение неизмененного $ str_url было бы лучше. Кроме того, у вас есть проверка строки, но вы не уверены, что это действительно URL, который можно проанализировать (и если нет, то следующий код сломается - wp_parse_url может вернуть false, null, int, string и array). Кроме того, я не уверен, имеет ли смысл использовать его как черту, не все используют классы везде (эй, это WordPress, верно?).
Игорь Воротнов