เป็นไปได้ที่จะได้รับลิงค์จากหน้ากระสุนหรือไม่?


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 คืออะไร
เซโอ

3
get_page_by_path()ส่งคืนอาร์เรย์ของข้อมูลหน้าทั้งหมด get_permalink()ใช้ ID หน้าเป็นอาร์กิวเมนต์แรก ฉันคิดว่าฉันต้องส่งค่า ID อย่างชัดเจน
Sampson

10
@ โจนาธาน: มันไม่ได้บันทึกไว้เสมอ แต่ฟังก์ชั่น 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ของ WordPress (บรรทัด 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; }

ทำไม? มันไม่ได้สร้างวัตถุโพสต์ที่สมบูรณ์เพียงเพื่อรับ ID
s_ha_dum

@webcitron ฉันคิดว่าเป็นเพราะรูปแบบดั้งเดิมของ Wordpress รับโพสต์โดย 'ชื่อ' เพียงแค่เปลี่ยนเป็น 'กระสุน' (ตรวจสอบลิงก์ )
Matheus Eduardo

นี่เป็นคำตอบที่ดี สิ่งนี้จะข้ามความเป็นไปได้ของปลั๊กอินหลอกลวงที่มาสก์หน้าของคุณหรือกรองอย่างไม่ถูกต้อง หากคุณส่งคืนรหัสจากตารางโพสต์คุณสามารถสร้างอินสแตนซ์ของ\WP_Postมันจากนั้นและจะแก้ไขโดยตรงในฟังก์ชั่น wordpress ทั้งหมดที่ตรวจสอบค่าอื่น ๆ \WP_Postยังมีวิธีการโดยตรงเพื่อค้นหาข้อมูลที่เกี่ยวข้องมากที่สุดเกี่ยวกับการโพสต์
mopsyd

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

มันทำงานกับประเภทโพสต์ที่กำหนดเองและประเภทโพสต์ในตัว (เช่น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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.