web-dev-qa-db-ja.com

カスタム投稿タイプループから投稿コンテンツを取得できません

何らかの理由で、次のコードを使用してカスタム投稿タイプのコンテンツを出力できません。私はここで何が足りないのですか? get_the_titleに対してはうまく機能しますが、同じパラメータを使ってget_the_contentを使用しても何も起こりません。

<?php
            $query = new WP_Query( ['post_type' => 'testimonials', 'posts_per_page' => -1 ] );
            foreach($query->get_posts() as $testimonial):
            $meta = get_post_meta($testimonial->ID);
            foreach($meta as &$m){
                if(is_array($m)){
                    $m = $m[0];
                }
            } ?>

            <div class="content"><?=get_the_content($testimonial->ID); ?></div>
            <div class="author">- <?=get_the_title($testimonial->ID); ?> / <span class="company_name"><?=$meta['_testimonial_company_name'] ?></span></div>
            <div class="link"><a href="<?=home_url('/testimonials'); ?>" title="View All Testimonials">View More</a></div>
            <?php endforeach; ?>
3
Zach Smith

他の答えが述べたように、あなたはThe Loopにいないのでget_the_*()関数は正しく動かないでしょう。 $query->get_posts()をループしているので、WP_Postオブジェクトを使うことができます。

このようなものはうまくいくでしょう。

foreach($query->get_posts() as $testimonial):
    $meta = get_post_meta($testimonial->ID);
    foreach($meta as &$m){
            if(is_array($m)){
                $m = $m[0];
            }
        }

    <div class="content"><?= do_shortcode($testimonial->post_content); ?></div>
    <div class="author">- <?=$testimonial->post_title; ?> / <span class="company_name"><?=$meta['_testimonial_company_name'] ?></span></div>
    <div class="link"><a href="<?=home_url('/testimonials'); ?>" title="View All Testimonials">View More</a></div>            

<?php endforeach;?>

あなたの特定の状況に応じて、あなたはそのコンテンツもwpautop()したいと思うかもしれません。例えば。 do_shortcode(wpautop($testimonial->post_content))

二次ループを設定したい場合は、できます。しかしながら、あなたがネストループで作業していないと確信できない限り、setup_postdata()を使うべきではありません。

0
TheGentleman

get_the_content() はループ内で使用する必要があり、投稿のデータを設定する必要があります。

最初にsetup_postdata( $post );を使うべきです、そして次にあなたはget_the_content()を使うことができます。

しかし、ここにいくつかの問題があります。

  • まず第一に、foreachの代わりにループを使うことができます。
  • あなたは決して短いPHPタグを使うべきではありません。そもそもあなたのコードがどのように動くのか私は驚いています。
  • 読みやすくするためにクエリパラメータを配列に格納し、それをWP_Query();に渡すことをお勧めします。
  • フィルタが適用されていることを確認するには、the_content()の代わりにget_the_content()を使用してください。

これがあなたのコードを最適化したものです。

<?php
$args = array( 
    'post_type' => 'testimonials', 
    'posts_per_page' => 100
);
$q = new WP_Query( $args );
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        $company_name = get_post_meta( get_the_ID(), '_testimonial_company_name', true );
        ?>
        <div class="content"><?php the_content(); ?></div>
        <div class="author">- <?php the_title(); ?> / <span class="company_name"><?php echo $company_name; ?></span></div>
        <div class="link"><a href="<?php echo home_url( '/testimonials' ); ?>" title="View All Testimonials">View More</a></div><?php
    }
}
?>
0
Jack Johansson