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

113

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

<a href="<?php echo get_page_link(40); ?>">Map</a>

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

<a href="<?php echo get_page_link('map'); ?>">Map</a>
Сэмпсон
источник

Ответы:

183

Вы говорите о страницах правильно? Не посты.

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

  1. get_permalink( get_page_by_path( 'map' ) )
  2. get_permalink( get_page_by_title( 'Map' ) )
  3. home_url( '/map/' )
Zeo
источник
4
Вы имели в виду get_permalink(get_page_by_path('contact')->ID));?
Сампсон
1
хм нету? Что с удостоверением личности?
Зео
3
get_page_by_path()возвращает массив всей информации о странице. get_permalink()принимает идентификатор страницы в качестве первого аргумента. Я думал, что мне придется явно передать значение идентификатора.
Сампсон
10
@Jonathan: Это не всегда документировано, но многие функции WP принимают в качестве аргумента как числовые идентификаторы, так и полные объекты post.
Ян Фабри
1
Кажется, что get_page_by_path () может быть довольно сложным для использования при работе с дочерними страницами ...
Kaaviar
9

Я думаю, что это может быть лучше:

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_titleWordPress . (строка 3173)

Rgds

Матеус Эдуардо
источник
11
Почему это будет лучше? Вы можете объяснить?
julien_c
Последний комментарий - я думаю, что 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; }
Почему? Он не генерирует полный объект post только для получения идентификатора.
s_ha_dum
@webcitron Я думаю, просто потому, что следует оригинальному шаблону Wordpress, получающему пост под заголовком, просто меняющему на слаг. (проверьте ссылку )
Матеус Эдуардо
Это хороший ответ. Это позволяет обойтись без мошеннического плагина, который маскирует вашу страницу или неправильно фильтрует ее. Если вы возвращаете идентификатор из таблицы записей, вы можете создать экземпляр \WP_Postиз него, и это разрешается непосредственно во всех функциях wordpress, которые проверяют другие значения. \WP_Postтакже предоставляет методы непосредственно, чтобы найти большинство связанных данных о посте.
mopsyd
6

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

/**
 * Returns the permalink for a page based on the incoming slug.
 *
 * @param   string  $slug   The slug of the page to which we're going to link.
 * @return  string          The permalink of the page
 * @since   1.0
 */
function wpse_4999_get_permalink_by_slug( $slug, $post_type = '' ) {

    // Initialize the permalink value
    $permalink = null;

    // Build the arguments for WP_Query
    $args = array(
        'name'          => $slug,
        'max_num_posts' => 1
    );

    // If the optional argument is set, add it to the arguments array
    if( '' != $post_type ) {
        $args = array_merge( $args, array( 'post_type' => $post_type ) );
    }

    // Run the query (and reset it)
    $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).

карите
источник
2

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

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'); ?>">Map</a>
Toskan
источник
1

Попробуй это:

<a href="<?php echo get_page_link( get_page_by_path( 'map' ) ); ?>">Map</a>

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

Сигма Вадбуде
источник
2
Пожалуйста, измените свой ответ и добавьте объяснение: почему это может решить проблему?
fuxia
0
    function theme_get_permalink_by_title( $title ) {

    // Initialize the permalink value
    $permalink = null;

    // Try to get the page by the incoming title
    $page = get_page_by_title( strtolower( $title ) );

    // If the page exists, then let's get its permalink
    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( 'Register For This Site' ) ) {
  // The permalink doesn't exist, so handle this however you best see fit.
} else {
  // The page exists, so do what you need to do.
} // end if/else
user46487
источник