web-dev-qa-db-ja.com

カスタム投稿タイプのアーカイブであるページで投稿IDを取得できません

表示したいカスタムフィールドがいくつかあるため、ページテンプレートとして使用しているカスタム投稿タイプarchive archive-projects.phpがあります。このページの投稿IDを取得しようとしていますが、試行する内容に応じて、nullまたはアーカイブ内の最初の投稿のIDを取得します。私は自分のコードを自分のページのループの上に配置しようとしましたが、うまくいきませんでした。

これが重複している場合は謝罪しますが、これについて多くのチュートリアルを検索してみましたが、カスタム投稿タイプのアーカイブでページテンプレートを使用するという特定のシナリオではまだ答えがありません。

私はこのコードを試してみましたが、うまくいきましたが、他の方法のどれもうまくいかないように思われる理由についてまだ困惑しています。ユーザーがページスラッグを変更した場合、これはもう機能しなくなるため、これを解決策として保持することは躊躇します。

$my_page_id = get_id_by_slug('projects');

function get_id_by_slug($page_slug) {
$page = get_page_by_path($page_slug);
if ($page) {
    return $page->ID;
} else {
    return null;
}
}

私は成功せずに次のことを試みました(私のテンプレートの私のカスタムループより上):

get_queried_object_id(); // returns nothing
$page_id = $wp_query->get_queried_object_id(); // returns 0

global $post; // I've tried including this and removing with same effect
$post = $wp_query->post;
$post_id = $post->ID; // returns the id of the first post in my archive

自分が間違っていることや、自分のプロジェクトページの実際のIDを取得する正しい方法について何かアイデアはありますか?

_ update _ 私のカスタム投稿タイプでは、has_archiveがtrueに設定されていました。私はカスタムテンプレートを作成しようとしましたが、WordPress階層のためにアーカイブページを探していました。私はhas_archiveをfalseに設定し、page-template-projects.phpというカスタムテンプレートを作成することで問題を解決しました。その後、Projectsというページを設定し、自分のカスタムテンプレートを使用しながら、そのページのIDを正しく取得できました。

5
Greg

編集

私はあなたの質問を誤解したかもしれないという考えを得ます

ちょっとだけメモ

  • archive-projects.phpがページテンプレートの場合は、名前を変更します。ページテンプレートのプレフィックスとして archive を使用してはいけません。それ以外の場合は、他の予約済みテンプレート名を使用してください。ページテンプレートは、page-{$name}.phpまたはテンプレート階層で使用される接頭辞付きの他の名前にする必要があります。これはWordpressを混乱させ、テンプレート階層と混同します

  • これがページテンプレートの場合は、get_queried_object_id();でIDを取得するか、echo get_queried_object_id();で表示する必要があります。

  • これが本当のアーカイブページであるならば、あなたはIDを得ないでしょう

もともとの答え

アーカイブページ、投稿タイプのアーカイブページ、カテゴリのアーカイブ、日付のアーカイブなど、検索ページ、単一ページ、およびホームページが疑似ページであるかどうか、つまり偽のページ。彼らはデータベースに保存されているページを作成されていないため、彼らは存在しないので、彼らはIDを持っていません

これらのページは、それらが表示する特定の投稿またはアーカイブのIDを「継承」しますが、それ自体はまだIDを持っていないので、ホームページ、日付アーカイブ、検索ページおよび投稿タイプアーカイブページを受け入れます

したがって、要するに、あなたのカスタム投稿アーカイブページにはIDがありません。

コンセプトの証明

あなたはあなたのアーカイブページでvar_dump($wp_query)をすることができます、あなたは本物のページだけがIDを持っているのを見るでしょう

?><pre><?php var_dump($wp_query); ?></pre><?php 
5
Pieter Goosen

私のカスタム投稿タイプはhas_archiveをtrueに設定していました。私はカスタムテンプレートを作成しようとしましたが、WordPress階層のためにアーカイブページを探していました。has_archiveをfalseに設定し、page-template-projects.phpというカスタムテンプレートを作成することで問題を解決しました。 (名前は重要ではありません)その後、Projectsというページを設定し、自分のカスタムテンプレートを使用しながら、そのページのIDを正しく取得できました。

カスタム投稿タイプを設定している場合は、has_archiveを書き留めて、それを使用するようにしてください。これをfalseに設定すると、テンプレート内のWP_Queryを使用して独自のテンプレートとカスタムクエリを簡単に作成し、カスタム投稿タイプに属する投稿を一覧表示できます。

0
Greg