Чи можливо отримати посилання на сторінку від її слизи?


113

Чи можна отримати постійна посилання на сторінку лише від слизи? Мені відомо, що ви можете отримати постійну посилання сторінки з ідентифікатора, використовуючи 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/' )

4
Ви мали на увазі get_permalink(get_page_by_path('contact')->ID));?
Сампсон

1
хммм ніпе? Що з ідентифікатором?
зео

3
get_page_by_path()повертає масив всієї інформації про сторінку. get_permalink()приймає ідентифікатор сторінки в якості першого аргументу. Я думав, що мені доведеться явно передати значення ID.
Сампсон

10
@Jonathan: Це не завжди задокументовано, але багато функцій WP приймають аргументи як числових ідентифікаторів, так і повних об'єктів пост.
Ян Фабрі

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; }

Чому? Він не генерує повний об'єкт пошти лише для отримання ідентифікатора.
s_ha_dum

@webcitron Я думаю, що саме тому, що слідує оригінальній схемі Wordpress, отримуючи повідомлення за "title", просто змінюючи на "slug". (перевірити посилання )
Матей Едуардо

Це хороша відповідь. Це оминає можливість плагіну, який маскує вашу сторінку або неправильно фільтрує її. Якщо ви повернете ідентифікатор з таблиці публікацій, ви можете створити екземпляр \WP_Postз нього, і це вирішиться безпосередньо у всіх функціях wordpress, які перевіряють інші значення. \WP_Postтакож надає методи безпосередньо для пошуку найбільш пов’язаних даних про публікацію.
мопсид

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>

1

Спробуйте це:

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

get_page_by_path( 'path' )повертає сторінку / об'єкт публікації, який потім може бути використаний, get_page_link()оскільки він приймає об'єкт повідомлення / сторінка та повертає постійну посилання.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.