Можно ли получить ссылку на страницу из её слага?

7 дек. 2010 г., 19:09:07
Просмотры: 219K
Голосов: 150

Возможно ли получить постоянную ссылку страницы, используя только слаг? Я знаю, что можно получить ссылку на страницу по ID, используя get_page_link():

<a href="<?php echo get_page_link(40); ?>">Карта</a>

Мне интересно, есть ли способ сделать то же самое со слагом страницы - например, так:

<a href="<?php echo get_page_link('map'); ?>">Карта</a>
2
Комментарии

Вы также можете использовать: site_url('page-slug')

user123456789 user123456789
13 янв. 2021 г. 09:19:51

Обратите внимание, что многие ответы путают slug записи (столбец post_name в таблице базы данных wp_posts) с заголовком записи, что не одно и то же. Это также отличается от пути записи (особенно заметно при использовании иерархических путей или когда две записи разных типов имеют одинаковый slug).

Flimm Flimm
14 июл. 2022 г. 14:41:11
Все ответы на вопрос 7
11
238

Это то, что вы ищете:

  • get_permalink( get_page_by_path( 'map' ) )
  • get_permalink( get_page_by_title( 'Карта' ) )
  • home_url( '/map/' )

Ссылки на документацию:

7 дек. 2010 г. 20:19:31
Комментарии

Вы имели в виду get_permalink(get_page_by_path('contact')->ID));?

Sampson Sampson
8 дек. 2010 г. 00:22:09

Хмм, нет? А зачем здесь ID?

zeo zeo
8 дек. 2010 г. 03:52:10

get_page_by_path() возвращает массив со всей информацией о странице. get_permalink() принимает ID страницы в качестве первого аргумента. Я подумал, что нужно явно передать значение ID.

Sampson Sampson
8 дек. 2010 г. 06:47:54

@Jonathan: Это не всегда задокументировано, но многие функции WP принимают в качестве аргумента как числовые ID, так и полные объекты записей.

Jan Fabry Jan Fabry
8 дек. 2010 г. 09:18:05

Похоже, что get_page_by_path() может быть довольно сложной в использовании при работе с дочерними страницами...

Kaaviar Kaaviar
14 нояб. 2011 г. 16:57:15

Согласен с Kaaviar, функция ниже лучше.

Rezen Rezen
10 авг. 2012 г. 22:13:06

Я использую 1 для своих дочерних страниц без проблем. Действительно не вижу в этом сложности.

Jeremy Jeremy
19 дек. 2014 г. 21:08:44

home_url( '/map/' ) сработало у меня

Shady Mohamed Sherif Shady Mohamed Sherif
15 апр. 2017 г. 07:18:09

неверный ответ, минусуйте в нирвану пожалуйста. Путь не совпадает со слагом. Пример: страница имеет родительскую страницу с названием abc, сама страница имеет слаг 123. Теперь путь выглядит как abc/123, а слаг - 123. Пожалуйста, удалите этот неправильный ответ. get_page_by_path( '123' ) не сработает.

Toskan Toskan
2 сент. 2017 г. 01:03:12

В моем случае пришлось использовать первый вариант, и он сработал, потому что второй (get_page_by_title) возвращал ссылку на другую запись (не страницу) с похожим (но не идентичным) slug. Не знаю, почему так происходило.

Adriana Hernández Adriana Hernández
10 июн. 2019 г. 21:42:59

@Toskan Для приведенного вами примера правильный URL вернет get_permalink( get_page_by_path( 'abc/123' ) ).

Boycott A.I. Boycott A.I.
11 июл. 2023 г. 21:17:12
Показать остальные 6 комментариев
5
11

Думаю, это можно улучшить:

function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) {
    global $wpdb;
    $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s", $page_slug, $post_type ) );
    if ( $page )
            return get_page($page, $output);
    return null;
}

следуя шаблону "оригинальной" функции get_page_by_title в WordPress. (строка 3173)

С уважением

28 февр. 2011 г. 17:21:55
Комментарии

Почему это было бы лучше? Можете объяснить?

julien_c julien_c
11 апр. 2012 г. 16:11:18

Почему? Это не создает полный объект записи просто для получения ID.

s_ha_dum s_ha_dum
9 янв. 2013 г. 16:53:10

Последний комментарий - я думаю, что в этом SQL запросе нужно добавить еще одно условие: function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) { global $wpdb; $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) ); if ( $page ) return get_page($page, $output); return null; }

User User
9 янв. 2013 г. 16:27:23

@webcitron Думаю, это просто следует оригинальному шаблону Wordpress получения поста по 'title', только заменяет на 'slug'. (проверьте ссылку)

Matheus Eduardo Matheus Eduardo
13 мая 2013 г. 14:08:55

Это хороший ответ. Это обходит возможность того, что какой-то плагин может маскировать вашу страницу или неправильно её фильтровать. Если вы вернёте id из таблицы постов, то сможете создать экземпляр \WP_Post из него, и это будет напрямую работать во всех функциях Wordpress, которые проверяют другие значения. \WP_Post также предоставляет методы для непосредственного поиска большинства связанных данных о посте.

mopsyd mopsyd
23 мар. 2018 г. 05:53:05
1

Это метод, опубликованный Томом МакФарлином в своем блоге:

/**
 * Возвращает постоянную ссылку для страницы на основе переданного ярлыка (slug).
 *
 * @param   string  $slug   Ярлык страницы, на которую нужно создать ссылку.
 * @param   string  $post_type  Тип записи (необязательный параметр).
 * @return  string          Постоянная ссылка страницы
 * @since   1.0
 */
function wpse_4999_get_permalink_by_slug( $slug, $post_type = '' ) {

    // Инициализация переменной для хранения ссылки
    $permalink = null;

    // Формируем аргументы для WP_Query
    $args = array(
        'name'          => $slug,
        'max_num_posts' => 1
    );

    // Если передан необязательный параметр, добавляем его в массив аргументов
    if( '' != $post_type ) {
        $args = array_merge( $args, array( 'post_type' => $post_type ) );
    }

    // Выполняем запрос (и сбрасываем его)
    $query = new WP_Query( $args );
    if( $query->have_posts() ) {
        $query->the_post();
        $permalink = get_permalink( get_the_ID() );
        wp_reset_postdata();
    }
    return $permalink;
}

Метод работает как с пользовательскими типами записей, так и со встроенными (такими как post и page).

31 янв. 2013 г. 23:19:43
Комментарии

В WordPress 6.4.2 мне пришлось использовать post_name вместо name в запросе $args

Scribblemacher Scribblemacher
12 янв. 2024 г. 19:56:06
0

принятый ответ неверен, потому что иерархические страницы работают не так. Проще говоря, ярлык (slug) не всегда соответствует пути страницы или записи. Например, если ваша страница имеет дочернюю, путь будет родительский-ярлык/дочерний-ярлык, и функция get_page_by_path не сможет найти дочерний-ярлык таким образом. Правильное решение выглядит так:

function mycoolprefix_post_by_slug($the_slug, $post_type = "page"){
 $args = array(
   'name'        => $the_slug,
   'post_type'   => $post_type,
   'post_status' => 'publish',
   'numberposts' => 1
 );
 $my_page = get_posts($args)[0];
 return $my_page;
}

<a href="<?php echo mycoolprefix_post_by_slug('map'); ?>">Карта</a>
2 сент. 2017 г. 01:10:53
2

Попробуйте так:

<a href="<?php echo get_page_link( get_page_by_path( 'map' ) ); ?>">Карта</a>

Функция get_page_by_path( 'path' ) возвращает объект страницы/записи, который затем можно использовать в get_page_link(), так как она принимает объект страницы/записи и возвращает постоянную ссылку.

26 февр. 2018 г. 13:54:08
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?

fuxia fuxia
26 февр. 2018 г. 15:27:02

Обратите внимание, что путь (path) не обязательно совпадает с ярлыком (slug).

Flimm Flimm
14 июл. 2022 г. 14:39:04
1
-1
    function theme_get_permalink_by_title( $title ) {

    // Инициализируем значение постоянной ссылки
    $permalink = null;

    // Пытаемся получить страницу по переданному заголовку
    $page = get_page_by_title( strtolower( $title ) );

    // Если страница существует, получаем её постоянную ссылку
    if( null != $page ) {
        $permalink = get_permalink( $page->ID );
    } // end if

    return $permalink;

} // end theme_get_permalink_by_title

Используйте эту функцию следующим образом

if( null == theme_get_permalink_by_title( 'Регистрация на сайте' ) ) {
  // Постоянная ссылка не существует, обработайте это как считаете нужным
} else {
  // Страница существует, выполните необходимые действия
} // end if/else
11 нояб. 2014 г. 06:49:51
Комментарии

Заголовок не совпадает с ярлыком.

Flimm Flimm
14 июл. 2022 г. 14:39:50
1
-1

Немного запоздало, но всё же...

Вы можете сделать так:
<?php $map = get_page_by_title( 'map' ); ?>
<a href="<?php echo get_page_link('$map->ID'); ?>">Карта</a>

Вот как я это делаю :-)

Спасибо,
Джош

1 янв. 2021 г. 16:59:52
Комментарии

Заголовок не совпадает с частью URL.

Flimm Flimm
14 июл. 2022 г. 14:39:35