そのスラッグからページリンクを取得することは可能ですか?


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));ですか?
サンプソン

1
うーん IDとは何ですか?
ゼオ

3
get_page_by_path()すべてのページ情報の配列を返します。get_permalink()最初の引数としてページIDを取ります。ID値を明示的に渡す必要があると思いました。
サンプソン

10
@Jonathan:常に文書化されているわけではありませんが、多くのWP関数は引数として数値IDと完全な投稿オブジェクトの両方を受け入れます。
ヤンファブリ

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

最後のコメント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

これは良い答えです。これにより、ページをマスクしたり、誤ってフィルタリングしたりする不正なプラグインの可能性が回避されます。postテーブルからidを返す場合、そこ\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-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オブジェクトを受け取り、パーマリンクを返すために使用できる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.