web-dev-qa-db-ja.com

"pre_get_posts"を使って最近の投稿に私のカスタム投稿タイプを表示させる方法

  1. カスタム投稿タイプを作成しました(「my-post-type」と呼びます)。
  2. すべてのカスタム投稿タイプを表示するためのarchive-my-post-type.phpページを作成しました。
  3. サイドバーの[最近の投稿]セクションを見ると、カスタム投稿タイプのどれもが表示されていないことがわかりました。
  4. カスタム投稿タイプを最近の投稿にも表示したいのですが。
  5. 私は読んで この記事 ここ WP 最近の投稿(サイドバー)に私のカスタム投稿タイプを追加するためにpre_get_postsを使うことができるというスタック。
  6. それを試してみました。それはうまくいきませんでした。

そう...

私はpre_get_postsと私が言うことができるものからいくつかの調査をしました...

  • pre_get_postsメインループを変更するために使用されます。

コーデックス この警告を与える:

ターゲットクエリの識別

Pre_get_postsを使用するときは、変更しているクエリに注意してください。便利なツールの1つがis_main_query()です。これは、変更しているクエリがメインクエリのみであることを確認するのに役立ちます。

  • そのタイトルの"ターゲットクエリ"(私には)のように思われ、Ican"target"どのクエリを変更したいのか。
  • また、スタックからの コード alsonotを使用しますis_main_query()
  • だから今私は思っています... "最近の投稿"NOT"main query"の一部"

だから私は正確にページで実行されたクエリを確認するためにいくつかのコードを追加し、見たtwoクエリ...

このクエリはページ全体の上にあります(その後に私のすべてのカスタム投稿が続きます)...

'SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'press-release' AND (wp_posts.post_status = 'publish')  ORDER BY wp_posts.post_date DESC LIMIT 0, 10'

他のクエリはサイドバー...の上にあります。

'SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish')  ORDER BY wp_posts.post_date DESC LIMIT 0, 5'

カスタム投稿タイプをthisqueryに追加します。

できます(そして、SHOULD)pre_get_postsを使ってこれを達成しますか?

私はかなり緑なので、この質問が理にかなっていることを本当に願っています。

2
sleeper

そうですね、あなたはpre_get_postsを使うべきではありません、それはサイトの中のすべてのクエリを変えるでしょう。

また、最近の投稿プラグインによって行われたクエリは、メインのクエリではありません。メインクエリは、URLからクエリ変数を解析した後に現在のページを表示するために作成されます。現在のページテンプレートに対しては、それが責任を負います。

あなたがすべきことは、フィルタフィルタwidget_posts_argsです:

add_filter( 'widget_posts_args', 'wp130512_recent_posts_args');

/**
 * Add CPTs to recent posts widget
 *
 * @param array $args default widget args.
 * @return array $args filtered args.
 */
function wp130512_recent_posts_args($args) {
    $args['post_type'] = array('post', 'my_CPT');
    return $args;
}

OR

より多くの制御のために最近の投稿ウィジェットクラス(WP_Widget_Recent_Posts)を拡張してください。

コード例: http://rollinglab.com/2012/06/extend-wordpress-recent-posts-widget/ /

5
Dan Ștefancu