スラッグによるWordPressクエリ単一投稿


87

ループを使用せずに単一の投稿を表示したい場合は、次を使用します。

<?php
$post_id = 54;
$queried_post = get_post($post_id);
echo $queried_post->post_title; ?>

問題は、サイトを移動すると、通常IDが変更されることです。この投稿をスラッグでクエリする方法はありますか?


3
サイトを移動するとIDが変わるのはなぜですか?WPのインポート/エクスポート機能を使用してサイトを移動する場合を除きます(これはそれほど信頼性が高くないため、避けることをお勧めします)。データベースを単に移行する場合、何も変更されません。
ennui 2013

回答:


120

WordPressコーデックスから:

<?php
$the_slug = 'my_slug';
$args = array(
  'name'        => $the_slug,
  'post_type'   => 'post',
  'post_status' => 'publish',
  'numberposts' => 1
);
$my_posts = get_posts($args);
if( $my_posts ) :
  echo 'ID on the first post found ' . $my_posts[0]->ID;
endif;
?>

WordPressコーデックスは投稿を取得します


1
これはIDを示しています-$ my_posts [0]-> ID; -しかし、ページのコンテンツを表示するにはどうすればよいですか?私はすべてを試しましたが、何も機能しません!
ジェームズウィルソン

1
@JamesWilsonはkintの使用を開始します。echo $my_posts[0]->post_content
Toskan 2015

これは、いくつかのナメクジが非常に類似している場合(たとえば、「作業」と「作業」)、複数の、したがってあいまいな結果を返すようです
Simon H

2
理由はわかりませんが、このクエリを機能させるには、「name」を「post_name」に変更する必要がありました
Mike

これは、注目の画像を取得するために機能します$ feat_image = wp_get_attachment_url(get_post_thumbnail_id($ my_posts [0]-> ID));
オマール

70

どうですか?

<?php
   $queried_post = get_page_by_path('my_slug',OBJECT,'post');
?>

9
子ページまたは階層的なカスタム投稿タイプに注意してmy-slugくださいmy-parent-slug/my-slug次の
Erenor Paz

2
この投稿を読んでからの私の経験は@ErenorPazをサポートしています-それは確かにきれいで単純かもしれませんが、親の投稿を変更するだけで変更できるスラッグの一貫性に依存すると複雑になります...ため息-おそらく私たちパスでワイルドカードを許可するようにWordPress開発者を説得することができます。例:get_page_by_path( '* / my_slug');
aequalsb 2017

あまり信頼できない
アミン

7

より安価で再利用可能な方法

function get_post_id_by_name( $post_name, $post_type = 'post' )
{
    $post_ids = get_posts(array
    (
        'post_name'   => $post_name,
        'post_type'   => $post_type,
        'numberposts' => 1,
        'fields' => 'ids'
    ));

    return array_shift( $post_ids );
}

6

wordpress apiが変更されたため、パラメータ「post_name」でget_postsを使用することはできません。Maartens関数を少し変更しました:

function get_post_id_by_slug( $slug, $post_type = "post" ) {
    $query = new WP_Query(
        array(
            'name'   => $slug,
            'post_type'   => $post_type,
            'numberposts' => 1,
            'fields'      => 'ids',
        ) );
    $posts = $query->get_posts();
    return array_shift( $posts );
}

パフォーマンスを向上さ'no_found_rows' => trueせるために、get_posts引数にも追加します。
フィリップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.