ループ内の現在の投稿インデックス番号を印刷


17

ループ内で投稿を取得する次のコードがあるWordPressに取り組んでいます。

        <?php
                $posts = $woo_options['woo_latest_entries'];
                query_posts('post_type=post&category_name=company');
                if ( have_posts() ) : while ( have_posts() ) : the_post(); $count++;

        ?>

        /// Post Content Goes Here //

        <?php endwhile; endif; ?>

どの出力がループ内にこのようなものを投稿しています...

Post Goes Here ....

Other Post Goes Here ....

Another Post Goes Here ....
.....

私が欲しいのは、ループ内で現在の投稿のインデックス番号を印刷することです。例

 1. Post Goes Here ....

 2. Other Post Goes Here ....

 3. Another Post Goes Here ....
 .....

どうすればこれを達成できますか?ありがとう。

編集

ああ!このようにできます。

<?php 
echo $wp_query->current_post +1; 
?>

他の/より良い方法はありますか?

回答:


16

実際、投稿インデックスごとにIDを割り当てたいです!

変更したコードは次のとおりです。

<?php

global $wp_query;

$posts = $woo_options['woo_latest_entries'];
query_posts('post_type=post&category_name=company');

if ( have_posts() ) : while ( have_posts() ) : the_post();  $count++;
    $index = $wp_query->current_post + 1;

?>
    <div id="my_post_<?php echo $index; ?>">

        <!-- Post Content Goes Here -->

    </div>

<?php endwhile; endif; ?>

この答えが解決につながる答えの本質を提供したようです。
新しいアレクサンドリア

4

単なる見た目の美しさで、さらにコーディングするためにcount変数を使用する必要がない場合は、olタグで投稿をラップするだけです。

<?php if ( have_posts() ) : ?>

    <ol>

        <?php while ( have_posts() ) : the_post(); ?>

            <li> <!-- Post Content Goes Here --> </li>

        <?php endwhile; ?>

    </ol>

<?php endif; ?>

実際、投稿インデックスごとにIDを割り当てたいです!
マンダー

@MANnDAaR、それがまさにそれです。ループに10個の投稿がある場合、1〜10の番号が付けられた順序付きリストが表示されます(こちらの例を参照
mike23

3

何らかの理由で、すでにループ内にカウンター変数があります。これが他の目的に使用されていない場合は、単にエコーします。

<?php echo $count.'.'; ?> /// Post Content Goes Here // 

1

こんにちは、私はこのスレッドにぶつかりました。血まみれの簡単なことがわかりました。メインテンプレートファイル(index.phpなど)で、ループの前に変数$ post_idxを宣言し、ループ内でその変数をインクリメントします。このような:

<?php $post_idx = 0; while ( have_posts() ) : the_post(); ?>
  <?php
    get_template_part( 'content', get_post_format() );
    $post_idx++;
  ?>
<?php endwhile; ?>

次に、ループ内で毎回実行されるコンテンツテンプレート(content.phpなど)で、$ post_idxをグローバルに設定し、それを必要に応じて使用します。

global $post_idx;
print "<p>{$post_idx}</p>";

それでおしまい!


名前の衝突を避けるために、グローバル変数にプレフィックスを付ける必要があります。
FUXIA

0

私は同じことをしようとしていましたが、ループの外側でした。基本的に、私はそのIDから投稿のインデックスを見つけたいと思っていました。ここに私が思いついたものがあります:

<?php
function sleek_get_post_index ($post) {
    $allPosts = get_posts([
        'post_type' => $post->post_type,
        'numberposts' => -1
    ]);

    $index = 0;

    foreach ($allPosts as $p) {
        $index++;

        if ($p->ID == $post->ID) {
            break;
        }
    }

    return $index;
}

これは、クライアントが投稿の隣に数字を必要としていたため、純粋にデザインのためでした。たとえ投稿がそれ自体で「特色の投稿」ボックスに入っていたとしてもです。また、次を使用して先行ゼロを追加しました<?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>


0

この質問が古い場合でも、Google検索から来た人がより柔軟な回答を必要とする場合に備えて、ここで説明します。

時間の経過とともに、WP_Queryグローバルクエリに依存しないソリューションを開発しました。customを使用すると、WP_Queryのみを使用するincluderequire、で変数を使用できるように制限されます$custom_queryが、場合によっては(私にとってはほとんどの場合です!)、作成するテンプレートパーツはグローバルクエリで使用されることがあります(アーカイブテンプレートなど)またはカスタムWP_Query(フロントページのカスタム投稿タイプのクエリなど)。つまり、クエリの種類に関係なく、グローバルにアクセスできるカウンターが必要です。WordPressではこれを利用できませんが、いくつかのフックのおかげでこれを実現する方法を次に示します。

これをfunctions.phpに配置します

/**
 * Create a globally accessible counter for all queries
 * Even custom new WP_Query!
 */

// Initialize your variables
add_action('init', function(){
    global $cqc;
    $cqc = -1;
});

// At loop start, always make sure the counter is -1
// This is because WP_Query calls "next_post" for each post,
// even for the first one, which increments by 1
// (meaning the first post is going to be 0 as expected)
add_action('loop_start', function($q){
    global $cqc;
    $cqc = -1;
}, 100, 1);

// At each iteration of a loop, this hook is called
// We store the current instance's counter in our global variable
add_action('the_post', function($p, $q){
    global $cqc;
    $cqc = $q->current_post;
}, 100, 2);

// At each end of the query, we clean up by setting the counter to
// the global query's counter. This allows the custom $cqc variable
// to be set correctly in the main page, post or query, even after
// having executed a custom WP_Query.
add_action( 'loop_end', function($q){
    global $wp_query, $cqc;
    $cqc = $wp_query->current_post;
}, 100, 1);

このソリューションの利点は、カスタムクエリを入力して一般的なループに戻ると、どちらの方法でも正しいカウンターにリセットされることです。クエリ内にいる限り(WordPressの場合は常にそうですが、ほとんど知りませんでした)、カウンターは正しくなります。これは、メインクエリが同じクラスで実行されるためです!

例:

global $cqc;
while(have_posts()): the_post();
    echo $cqc; // Will output 0
    the_title();

    $custom_query = new WP_Query(array('post_type' => 'portfolio'));
    while($custom_query->have_posts()): $custom_query->the_post();
        echo $cqc; // Will output 0, 1, 2, 34
        the_title();
    endwhile;

    echo $cqc; // Will output 0 again
endwhile;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.