私は奇妙な問題に遭遇しました。
私はget_posts
で構築されたカスタムループを持っていて、それはページを普通にロードするときうまくいきます:
<?php
$rows = get_posts(array(
'post_type' => 'drinks',
'numberposts' => -1
));
?>
<?php foreach ($rows as $post) : setup_postdata($post) ?>
<?php the_post_thumbnail() ?>
<h3><?php the_title() ?></h3>
<?php the_content() ?>
<?php the_permalink() ?>
<?php endforeach; wp_reset_postdata() ?>
そのコードは "drinks.php"と呼ばれるそれ自身のテンプレートの中にあります。
JQueryを使ってこのテンプレートを取得するためのAJAX関数/ URLを設定しました。
add_action('wp_ajax_h5b_get_user_drinks', 'h5b_ajax_get_user_drinks');
add_action('wp_ajax_nopriv_h5b_get_user_drinks', 'h5b_ajax_get_user_drinks');
function h5b_ajax_get_user_drinks () {
include 'drinks.php';
die;
}
しかし、AJAXでフェッチしたとき、the_title()
、the_post_thumbnail()
、the_permalink()
のいずれも動作しないようです。 the_content()
はうまく動作するようです。
私が自分のループの中でvar_dump($post)
した場合、それは必要なすべてのデータを持っています(title、guidなど)。
どうすればいいの?
これを試して:
function h5b_ajax_get_user_drinks(){ return get_template_part( 'drink'); exit; }
$post
をグローバルなものとして扱う必要があります。
global $post;
<?php foreach ($rows as $post) : setup_postdata($post) ?>
<?php the_post_thumbnail() ?>
<h3><?php the_title() ?></h3>
<?php the_content() ?>
<?php the_permalink() ?>
<?php endforeach; wp_reset_postdata() ?>
これらの関数の大部分は、ループの中でしか機能できません(そしてパラメータなしで使用された場合はそれらすべても)。これが意味することは、グローバル$post
が適切な投稿を指しているということです。
注:setup_postdata($post)
はこれを行いません。したがって、手動でglobal $post
を宣言する必要があります。
おそらくより美的な答えを提供する、受け入れられた答えはget_template_part()
を使用します。そして、それは(load_template()
)を介して locate_template()
を呼び出します。ソースを見てください - これはコメントから、グローバルとして$post
変数を宣言します:
グローバルはテンプレートファイルに対して設定され、WordPress環境が関数内から利用できるようにします。
それゆえ、うまくいきます:)。