web-dev-qa-db-ja.com

Wordpress:post_class()をエコーで使う方法

私はWordpressでforeachループに取り組んでいて、その中のdivに 'post_class()'を追加したいです。現在のコードは次のようになります。

if ( is_array( $posts ) && !empty( $posts ) ) {

    echo '<ul class="tribe-related-events tribe-clearfix hfeed vcalendar">';
    foreach ( $posts as $post ) {
        echo '<li>';
            echo '<div class="overlay">';
                echo   '<div '. post_class() .'>'; 
                echo        '<h3>'. tribe_get_event_taxonomy() .'</h3>';
                echo    '</div>';
            echo '</div>';
        echo '</li>';
    }
    echo '</ul>';
}

'post_class()'関数はそれが入っているdivを壊し、それらがページの内容であるかのようにクラスを呼び出します。

何か案は?

2
user2248612

解決策は、私が最初に思ったよりも実際にはそれほど複雑ではありませんでした。 post_class()関数は文字列を返しませんが、代わりに文字列を「エコー」します。したがって、あなたが書くとき。

echo '<div ' . post_class() . '>'; 

効果は次のとおりです。

最初に、システムはpost_class()を実行し、クラス属性secondを持つ "echo ...."を生成し、システムは要求された連結を行い、テキスト ""をエコーし​​ます。

それを使う正しい方法は:

echo "<div ";
post_class();
echo ">";

それ以外の場合

echo '<div class="'. join( ' ', get_post_class() ) .'">';
4
user2248612

post_class() 関数は get_post_class() のラッパーです。

後者はechoではなくArrayを返すので、post_class()がするようなことをしなければならないことに注意してください。

$classes = join( '  ', get_post_class() );

あなたのコードは次のようになるでしょう。 ifチェックも最初に$postsが空かどうかをチェックし、次にそれが配列かどうかチェックするように変更しました - これはより安全です。

if (
    ! empty( $posts )
    AND is_array( $posts )
    )
{
    $items = array();
    foreach ( $posts as $post )
        $items[] = sprintf(
            '<li><div class="overlay"><div class="%s"></div><h3>%s</h3></div></div></li>',
            join( '  ', post_class() ),
            tribe_get_event_taxonomy()
        );

    ! empty( $items ) AND printf(
        '<ul class="tribe-related-events tribe-clearfix hfeed vcalendar">%s</ul>',
        join( '', $items )
    );
}
3
kaiser