In số chỉ mục bài viết hiện tại trong vòng lặp


17

Tôi đang làm việc trên WordPress nơi tôi có mã theo dõi để nhận các bài đăng trong vòng lặp.

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

Mà đầu ra bài viết bên trong Loops một cái gì đó như thế này ...

Post Goes Here ....

Other Post Goes Here ....

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

Những gì tôi muốn là in số chỉ mục bài viết hiện tại trong vòng lặp. Thí dụ

 1. Post Goes Here ....

 2. Other Post Goes Here ....

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

Làm thế nào tôi có thể đạt được điều này ? Cảm ơn.

BIÊN TẬP

Ồ! Tôi có thể làm theo cách này ..

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

Có cách nào khác / tốt hơn không?

Câu trả lời:


16

Trên thực tế tôi muốn chỉ định ID theo chỉ mục bài viết!

Đây là mã của bạn mà tôi đã sửa đổi.

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

Có vẻ như câu trả lời này cung cấp bản chất của câu trả lời dẫn đến giải pháp.
New Alexandria

4

Nếu đó chỉ là một thứ thẩm mỹ và bạn không cần sử dụng biến đếm để mã hóa thêm, bạn có thể chỉ cần bọc các bài đăng của mình trong một olthẻ:

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

    <ol>

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

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

        <?php endwhile; ?>

    </ol>

<?php endif; ?>

Trên thực tế tôi muốn chỉ định ID theo chỉ mục bài viết!
MANnDAaR

@MANnDAaR, đó chính xác là những gì nó làm. Nếu vòng lặp của bạn có 10 bài đăng, bạn sẽ thấy một danh sách được sắp xếp, được đánh số từ 1 đến 10. (xem ví dụ tại đây )
mike23

3

vì một số lý do, bạn đã có một biến đếm trong vòng lặp; nếu điều này không được sử dụng cho các mục đích khác, chỉ cần lặp lại nó:

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

1

Xin chào, tôi đã va vào chủ đề này, tự hỏi làm thế nào để làm điều đó quá. Phát hiện ra nó dễ dàng. Trong tệp mẫu chính, ví dụ index.php, khai báo một biến $ post_idx trước vòng lặp và trong phạm vi tăng vòng lặp var. Như thế này:

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

Sau đó, trong mẫu nội dung của bạn (ví dụ content.php) được thực thi mọi lúc trong vòng lặp, chỉ cần tạo $ post_idx toàn cầu và sau đó sử dụng nó cho nhu cầu của bạn:

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

Đó là nó!


Bạn nên thêm tiền tố vào các biến toàn cục để tránh xung đột đặt tên.
fuxia

0

Tôi đã tìm cách để làm điều tương tự, nhưng bên ngoài vòng lặp. Về cơ bản tôi muốn có thể tìm ra chỉ mục của một bài đăng từ ID của nó. Đây là những gì tôi nghĩ ra:

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

Điều này hoàn toàn dành cho thiết kế vì khách hàng muốn có số bên cạnh bài đăng, ngay cả khi bài đăng tự nó nằm trong hộp "bài đăng nổi bật". Tôi cũng đã thêm một số 0 hàng đầu bằng cách sử dụng : <?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>.


0

Ngay cả khi câu hỏi này đã cũ, tôi sẽ đặt câu hỏi này ở đây trong trường hợp ai đó đến từ Tìm kiếm của Google cần câu trả lời linh hoạt hơn.

Theo thời gian, tôi đã phát triển một giải pháp là WP_Querybất khả tri truy vấn toàn cầu. Khi bạn sử dụng một tùy chỉnh WP_Query, bạn bị giới hạn chỉ sử dụng includehoặc requirecó thể sử dụng các biến trên $custom_query, nhưng trong một số trường hợp (đó là hầu hết các trường hợp đối với tôi!), Các phần mẫu tôi tạo đôi khi được sử dụng trong truy vấn toàn cầu (chẳng hạn như mẫu lưu trữ) hoặc trong một tùy chỉnh WP_Query(như truy vấn loại bài đăng tùy chỉnh trên trang đầu). Điều đó có nghĩa là tôi cần một bộ đếm để có thể truy cập toàn cầu bất kể loại truy vấn nào. WordPress không cung cấp tính năng này, nhưng đây là cách để thực hiện điều đó nhờ một số móc nối.

Đặt cái này trong hàm của bạn.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);

Cái hay của giải pháp này là, khi bạn nhập vào một truy vấn tùy chỉnh và quay lại trong vòng lặp chung, nó sẽ được đặt lại về đúng bộ đếm. Miễn là bạn ở trong một truy vấn (luôn luôn là như vậy trong WordPress, bạn ít biết), bộ đếm của bạn sẽ chính xác. Đó là bởi vì truy vấn chính được thực hiện với cùng một lớp!

Thí dụ :

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.