Apakah mungkin untuk mendapatkan tautan halaman dari siputnya?


Apakah mungkin untuk mendapatkan permalink halaman dari siput saja? Saya sadar bahwa Anda bisa mendapatkan permalink halaman dari ID menggunakan get_page_link():

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

Saya ingin tahu apakah ada cara untuk melakukan hal yang sama dengan siput halaman - seperti ini:

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

Jawaban:


Anda sedang berbicara tentang Halaman, kan? Bukan Posting.

Apakah ini yang Anda cari:

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

4
Apakah maksud Anda get_permalink(get_page_by_path('contact')->ID));?
Sampson

1
hmmm tidak? Ada apa dengan ID?
zeo

3
get_page_by_path()mengembalikan array dari semua informasi halaman. get_permalink()mengambil ID halaman sebagai argumen pertama. Saya pikir saya harus secara eksplisit memberikan nilai ID.
Sampson

10
@ Jonathan: Ini tidak selalu didokumentasikan, tetapi banyak fungsi WP menerima ID numerik dan objek posting penuh sebagai argumen.
Jan Fabry

1
Tampaknya get_page_by_path () dapat menjadi sangat rumit untuk digunakan saat berurusan dengan halaman anak ...
Kaaviar

Saya pikir ini bisa lebih baik:

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

mengikuti pola "asli" get_page_by_titledari wordpress . (baris 3173)

rgds


11
Mengapa itu lebih baik? Bisakah Anda jelaskan?
julien_c

Komentar terakhir - Saya pikir sql perlu memiliki satu syarat lagi: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; }

Mengapa? Itu tidak menghasilkan objek posting lengkap hanya untuk mendapatkan ID.
s_ha_dum

@ webcitron Saya pikir hanya karena mengikuti pola asli Wordpress mendapatkan posting dengan 'judul', hanya mengubah untuk 'siput'. (periksa tautannya )
Matheus Eduardo

Ini jawaban yang bagus. Ini mem-bypass kemungkinan plugin jahat menutupi halaman Anda atau salah memfilternya. Jika Anda mengembalikan id dari tabel postingan, maka Anda dapat membuat instance \WP_Postdari itu, dan itu langsung diselesaikan di semua fungsi wordpress yang memeriksa nilai-nilai lain. \WP_Postjuga menyediakan metode langsung untuk menemukan sebagian besar data terkait tentang pos.
mopsyd

Ini adalah metode yang diterbitkan oleh Tom McFarlin di blognya :

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

Ini berfungsi dengan tipe posting khusus dan tipe posting bawaan (seperti postdan page).


jawaban yang diterima salah karena halaman hierarkis tidak berfungsi seperti itu. Sederhananya, siput tidak selalu jalur halaman atau posting. Misalnya halaman Anda memiliki anak dll. Jalan akan parent-slug/child-slugdan get_page_by_pathgagal menemukan child-slugcara ini. Solusi yang tepat adalah ini:

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>

Coba ini:

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

get_page_by_path( 'path' )mengembalikan halaman / objek pos yang kemudian dapat digunakan oleh get_page_link()karena menerima objek post / halaman dan mengembalikan permalink.


2
Harap edit jawaban Anda , dan tambahkan penjelasan: mengapa itu bisa menyelesaikan masalah?
fuxia

    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

Gunakan fungsi ini oleh

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.