web-dev-qa-db-ja.com

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

私は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
MANnDAaR

実際に私はポストインデックスごとに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; ?>
14
Evan Mattson

それが単なる審美的なもので、さらなるコーディングのためにcount変数を使用する必要がない場合は、投稿をolタグで囲むことができます。

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

    <ol>

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

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

        <?php endwhile; ?>

    </ol>

<?php endif; ?>
4
mike23

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

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

こんにちは私もそれを行う方法を疑問に思い、このスレッドにぶつかった。それは血だらけの簡単だとわかった。メインテンプレートファイル、たとえばindex.phpでは、ループの前に変数$ post_idxを宣言し、ループ内でそのvarをインクリメントします。このような:

<?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>";

それでおしまい!

1
Jerry303

私は同じことをやろうとしていましたが、ループの外側です。基本的に私はその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
powerbuoy

この質問が古くても、Google検索から来た人がもっと柔軟な答えを必要とする場合に備えて、ここに置いておきます。

時間が経つにつれて、私はWP_Queryまたはグローバルなクエリにとらわれないソリューションを開発しました。あなたがカスタムのWP_Queryを使うとき、あなたはあなたの$custom_query上の変数を使うことができるようにincluderequireだけを使うように制限されています、しかし、ある場合には(私にとっては大抵です!)グローバルクエリ(アーカイブテンプレートなど)またはカスタム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;