web-dev-qa-db-ja.com

the_title()とthe_permalink()は動作しません AJAX 呼び出し

私は奇妙な問題に遭遇しました。

私は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など)。

どうすればいいの?

4
powerbuoy

これを試して:

function h5b_ajax_get_user_drinks(){
 return get_template_part( 'drink'); 
 
 exit; 
}
2

$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環境が関数内から利用できるようにします。

それゆえ、うまくいきます:)。

5
Stephen Harris