Có thể có được một liên kết trang từ sên của nó?


113

Có thể lấy permalink của một trang từ sên một mình không? Tôi biết rằng bạn có thể lấy permalink của trang từ ID bằng cách sử dụng get_page_link():

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

Tôi tò mò liệu có cách nào để làm điều tương tự với sên của một trang - như thế này:

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

Câu trả lời:


183

Bạn đang nói về Trang phải không? Không phải bài viết.

Đây có phải là những gì bạn đang tìm kiếm:

  1. get_permalink( get_page_by_path( 'map' ) )
  2. get_permalink( get_page_by_title( 'Map' ) )
  3. home_url( '/map/' )

4
Ý bạn là get_permalink(get_page_by_path('contact')->ID));sao
Sampson

1
hmmm không ID là gì?
zeo

3
get_page_by_path()trả về một mảng của tất cả các thông tin trang. get_permalink()lấy ID trang làm đối số đầu tiên. Tôi nghĩ rằng tôi phải vượt qua giá trị ID một cách rõ ràng.
Sampson

10
@Jonathan: Không phải lúc nào cũng được ghi lại, nhưng nhiều hàm WP chấp nhận cả đối tượng bài ID và toàn bộ số làm đối số.
Jan Fabry

1
Có vẻ như get_page_by_path () có thể khá phức tạp để sử dụng khi xử lý các trang con ...
Kaaviar

9

Tôi nghĩ rằng điều này có thể tốt hơn:

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

theo mô hình "bản gốc" get_page_by_titlecủa wordpress . (dòng 3173)

rgds


11
Tại sao điều đó sẽ tốt hơn? Bạn có thể giải thích?
julien_c

Nhận xét cuối cùng - Tôi nghĩ rằng sql cần phải có thêm một điều kiện: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; }

Tại sao? Nó không tạo ra một đối tượng bài hoàn chỉnh chỉ để lấy ID.
s_ha_dum

@webcitron Tôi nghĩ chỉ vì đang theo mô hình ban đầu của Wordpress nhận được bài đăng theo 'title', chỉ thay đổi cho 'slug'. (kiểm tra liên kết )
Matheus Eduardo

Đây là một câu trả lời tốt. Điều này bỏ qua khả năng sở hữu của một plugin lừa đảo che giấu trang của bạn hoặc lọc không chính xác. Nếu bạn trả về id từ bảng bài đăng, thì bạn có thể tạo một thể hiện của \WP_Postnó và nó sẽ giải quyết trực tiếp trong tất cả các hàm wordpress để kiểm tra các giá trị khác. \WP_Postcũng cung cấp các phương pháp trực tiếp để tìm hầu hết các dữ liệu liên quan về bài đăng.
mopsyd

6

Đây là một phương pháp được Tom McFarlin công bố trên blog của mình :

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

Nó hoạt động với các loại bài đăng tùy chỉnh và các loại bài đăng tích hợp (như postpage).


2

câu trả lời được chấp nhận là sai vì các trang phân cấp không hoạt động như vậy. Nói một cách đơn giản, sên không phải lúc nào cũng là đường dẫn của trang hoặc bài đăng. Ví dụ: trang của bạn có một đứa trẻ, v.v ... đường dẫn sẽ parent-slug/child-slugget_page_by_pathsẽ không tìm thấy child-slugđường này. Giải pháp thích hợp là đây:

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

Thử đi:

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

get_page_by_path( 'path' )trả về đối tượng trang / bài đăng sau đó có thể được sử dụng bởi get_page_link()vì nó chấp nhận đối tượng bài / trang và trả về permalink.


2
Vui lòng chỉnh sửa câu trả lời của bạn và thêm một lời giải thích: tại sao điều đó có thể giải quyết vấn đề?
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

Sử dụng chức năng này bằng cách

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.