슬러그에서 페이지 링크를 얻을 수 있습니까?


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/' )

4
당신은 의미 했습니까 get_permalink(get_page_by_path('contact')->ID));?
Sampson

1
흠. ID는 무엇입니까?
zeo December

3
get_page_by_path()모든 페이지 정보의 배열을 반환합니다. get_permalink()첫 번째 인수로 페이지 ID를 사용합니다. ID 값을 명시 적으로 전달해야한다고 생각했습니다.
Sampson

10
@Jonathan : 항상 문서화 된 것은 아니지만 많은 WP 함수는 숫자 ID와 전체 게시물 객체를 인수로 허용합니다.
Jan Fabry

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_title워드 프레스 의 "원본"패턴 을 따른다 . (라인 3173)

rgds


11
왜 더 나을까요? 설명 할 수 있습니까?
julien_c

마지막 의견 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; }

왜? ID를 얻기 위해 완전한 게시물 객체를 생성하지는 않습니다.
s_ha_dum

@webcitron 나는 'slug'로 변경하여 'title'로 게시물을 얻는 Wordpress의 원래 패턴을 따르고 있다고 생각합니다. ( 링크 확인 )
Matheus Eduardo

이것은 좋은 대답입니다. 이것은 페이지를 마스킹하거나 잘못 필터링하는 악성 플러그인의 가능성을 우회합니다. 포스트 테이블에서 id를 반환하면 그 인스턴스를 생성 할 수 있으며 \WP_Post다른 값을 확인하는 모든 wordpress 함수에서 직접 확인됩니다. \WP_Post또한 게시물에 대한 대부분의 관련 데이터를 찾는 방법을 직접 제공합니다.
분에서

6

이것은 Tom McFarlin 이 자신의 블로그에 게시 한 방법입니다 .

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

맞춤 게시물 유형 및 기본 제공 게시물 유형 (예 : postpage) 과 함께 작동합니다 .


2

계층 적 페이지가 그렇게 작동하지 않기 때문에 허용되는 대답이 잘못되었습니다. 간단히 말해서, 슬러그가 항상 페이지 또는 게시물의 경로는 아닙니다. 페이지가 등 아이가 예를 들어 경로가 될 것입니다 parent-slug/child-slugget_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()post / page 객체를 받아들이고 permalink를 반환 할 때 사용할 수있는 page / post 객체를 반환합니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.