Sử dụng WP Query và Loop (vòng lặp) để lấy bài viết [NEW]



Truy vấn (truy vấn) là thuật ngữ được sử dụng phổ biến nhất trong WordPress để chỉ các truy vấn được gửi đến cơ sở dữ liệu để lấy thông tin Bài đăng (hoặc Trang, hoặc bất cứ thứ gì). Nếu giải thích cặn kẽ câu truy vấn thì dài lắm nhưng trong bài này bạn chỉ hiểu rằng Truy vấn là một tập hợp các lệnh SQL được gửi đến MySQL Server để lấy dữ liệu của các bài đăng trên WordPress.

Trong bài viết này, tôi sẽ hướng dẫn các bạn tìm hiểu về các truy vấn mặc định trong WordPress trên mỗi trang, và cách tạo một truy vấn mới cho cơ sở dữ liệu thông qua lớp WP_Query.

Cách truy vấn trên mỗi trang

Mặc định mỗi trang trên WordPress đều chứa một câu truy vấn, ví dụ như trên trang chủ nó sẽ gửi câu truy vấn lấy danh sách bài viết mới nhất, khi vào trang nội dung bài viết nó sẽ gửi câu truy vấn lấy thông tin của bài viết đó. dựa trên ID của bài viết (trong phần trước, tôi đã nói rằng WordPress có thể phân tích cú pháp truy vấn trên một trang dựa trên đường dẫn truy cập).

Nhưng để biết chính xác có bao nhiêu truy vấn trên trang của bạn và cách nó gửi, chúng tôi phải gỡ lỗi để xem. Cách đơn giản nhất là cài đặt plugin Debug Bar và sau đó chèn đoạn này vào wp-config.php:

define( ‘SAVEQUERIES’, true );

Sau đó, bạn vào trang chủ, nhấp vào nút Debug trên Admin Bar và xem phần WP Query.

Sử dụng WP Query và Loop (vòng lặp) để lấy bài viết [NEW]

Xem truy vấn trang với Debug Bar

Trong đó, phần trên là các thông tin quan trọng về truy vấn của trang hiện tại như mẫu đang thực hiện truy vấn (các tệp trong theme), loại truy vấn. Phần còn lại Truy vấn SQL là lệnh SQL thực thi truy vấn đó. Nếu bạn đã từng làm việc với SQL, chắc chắn bạn sẽ hiểu đoạn văn đó nghĩa là gì. Như trong hình, nó lấy dữ liệu trong bảng wp_posts, số thứ tự là 1 và cột post_type là post và post_status được xuất bản và sắp xếp nó dựa trên giá trị cột post_date theo thứ tự tăng dần với số lượng 10 đối tượng. Nhưng đừng lo lắng về những điều này vì WordPress hỗ trợ chúng ta tạo câu truy vấn nhanh nhất mà không cần phải nhớ tên bảng, tên cột gì cả.

Tương tự, bạn có thể truy cập các trang web khác và xem các truy vấn của họ.

Kết quả của truy vấn được lưu trữ ở đâu?

Sau khi gửi truy vấn, phải có kết quả trả về của truy vấn đó. Ví dụ, khi nó gửi một truy vấn để lấy một bài mới, chắc chắn nó sẽ trả về thông tin của bài mới mà truy vấn đang tìm kiếm. Và kết quả của truy vấn sẽ được lưu vào đối tượng $wp_query.

Bây giờ hãy thử tra cứu đối tượng $ wp_query bằng cách chèn đoạn mã sau vào cuối mẫu footer.php trong chủ đề:


<?php
    echo ‘<pre>’;
    print_r ($wp_query);
    echo ‘</pre>’;
?>

Và bây giờ, bạn có thể lướt qua các bài viết hoặc trang nhất định để xem thông tin của khán giả $wp_query sau khi nó gửi truy vấn, nó sẽ bao gồm tất cả thông tin nó nhận được (nếu để trống thì không).

Tuy nhiên, các bạn chú ý nhất cho mình ở thuộc tính posts.

wp-query-postobject

Và nếu bây giờ bạn chỉ cần xem dữ liệu của thuộc tính posts thì hãy sửa mã gỡ lỗi trỏ đến thuộc tính posts trong đối tượng $wp_query.


<?php
    echo ‘<pre>’;
    print_r ($wp_query->posts);
    echo ‘</pre>’;
?>

Nhưng tin tốt cho bạn là $wp_query->posts có một đối tượng riêng được đặt tên $postsvì vậy có thể bạn chỉ cần tra cứu đối tượng $posts là ra.


<?php
    echo ‘<pre>’;
    print_r ($posts);
    echo ‘</pre>’;
?>

Và như bạn có thể thấy, bây giờ chúng ta có thể thấy các thuộc tính trong đối tượng $posts thông tin về bài báo.

Thuộc tính trong $ bài viết.  sự vật

Thuộc tính trong $ bài viết. sự vật

Tuy nhiên nếu bạn cần truy xuất, chúng ta nên lấy theo đối tượng $post (không có s ở cuối). Bây giờ hãy thử mở lại mẫu footer.phpthử tra cứu thuộc tính post_content trong đối tượng $post hãy xem nào. Hoặc bạn có thể đặt nó vào bất kỳ mẫu nào trong chủ đề, ở bất kỳ vị trí nào.


<?php
    echo ‘<pre>’;
    print_r ($post->post_content);
    echo ‘</pre>’;
?>

Sử dụng vòng lặp cho truy vấn

Và nếu bạn làm đúng khi in $post->post_content thì nó sẽ trả về nội dung của bài đăng hiện tại nếu bạn vào xem nội dung của một bài đăng. Nhưng nếu bạn nhìn bên ngoài trang chỉ mục, hoặc các trang lưu trữ như thẻ, danh mục, v.v., nó chỉ hiển thị nội dung bài đăng đầu tiên. Tại sao?

Vì $ post thực chất là một đối tượng trong một mảng (array), nên nếu gọi như vậy thì PHP sẽ hiểu là chúng ta chỉ muốn gọi đối tượng đầu tiên trong mảng, nên khi xem các trang có nhiều bài viết thì nó cũng hiển thị. chỉ một bài. Và để nó hiển thị toàn bộ, chúng tôi phải tạo một vòng lặp (vòng lặp) cho mảng đối tượng đó để nó truy xuất nhiều bài báo. Và chúng tôi sẽ lặp lại qua phương pháp have_posts() trong đối tượng $wp_query.

Trước khi tìm hiểu sâu hơn, hãy hiểu cấu trúc của một vòng lặp trong WordPress và cấu trúc của nó như sau:


<?php
    if( $wp_query->have_posts() ) { // Nếu phương thức have_posts() trả về TRUE thì mới chạy code bên trong
        while( $wp_query->have_posts() ) { // Nếu have_posts() == TRUE thì nó mới lặp, không thì ngừng
            $wp_query->the_post(); // Thiết lập số thứ tự bài viết trong chỉ mục của query

            /*
             * Nội dung hiển thị bài viết
             */
            echo $post->post_title . ‘<br>’;

        }
    }
?>

Tôi viết điều đó để bạn hiểu, nhưng thông thường, WordPress thường rút gọn nó thành như thế này:


<?php
    if( $wp_query->have_posts() ) : while( $wp_query->have_posts() ) : $wp_query->the_post();

            /*
             * Nội dung hiển thị bài viết
             */
            echo $post->post_title . ‘<br>’;

        endwhile; endif;
?>

Bạn đặt cái này ở đâu đó trong template như trong footer.php chẳng hạn, sau đó ra trang chủ hoặc trang lưu trữ và bạn sẽ thấy nó hiển thị tiêu đề bài viết của nhiều bài báo khác nhau.

Nó có nghĩa là gì, mời bạn đọc bình luận và xem thêm chi tiết các phương pháp bên dưới.

Ý nghĩa của phương thức has_posts ()

Phương pháp have_posts() là một phương thức của lớp WP_Query cái tạo ra đối tượng $wp_query. Phương thức này được khai báo trong tệp /wp-includes/query.php tại các dòng 3739 – 3767.


    /**
     * Whether there are more posts available in the loop.
     *
     * Calls action ‘loop_end’, when the loop is complete.
     *
     * @since 1.5.0
     * @access public
     *
     * @return bool True if posts are available, false if end of loop.
     */
    public function have_posts() {
        if ( $this->current_post + 1 < $this->post_count ) {
            return true;
        } elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) {
            /**
             * Fires once the loop has ended.
             *
             * @since 2.0.0
             *
             * @param WP_Query &$this The WP_Query instance (passed by reference).
             */
            do_action_ref_array( ‘loop_end’, array( &$this ) );
            // Do some cleaning up after the loop
            $this->rewind_posts();
        }

        $this->in_the_loop = false;
        return false;
    }

Ý nghĩa của phương pháp này rất đơn giản, đó là nó sẽ Kiểm tra xem có bất kỳ bài đăng nào trong truy vấn không. Lý do nó có thể được kiểm tra là nó có số bài báo hiện tại (thuộc tính). current_post) cộng với 1 đơn vị nhỏ hơn tổng số bài đăng trong truy vấn (thuộc tính post_count) thì nó sẽ trả về true. Ngược lại là SAI.

Và đoạn này:

if( $wp_query->have_posts() )

tức là nó kiểm tra xem nó có các bài đăng trong truy vấn hiện tại ($ wp_query) hay không thì nó sẽ thực thi vòng lặp bên dưới.

while( $wp_query->have_posts() )

Và trong vòng lặp này, nó sẽ lặp nếu has_posts () trả về true. Nếu sai thì nó sẽ dừng lại.

phương thức the_post ()

Sau khi gọi vòng lặp ra, bạn có thể thấy nó có nhiều phương thức hơn the_post() nội bộ. Vậy đây là gì?

Phương thức này được khai báo trong /wp-includes/query.php tại các dòng 3712 – 3737.


    /**
     * Sets up the current post.
     *
     * Retrieves the next post, sets up the post, sets the ‘in the loop’
     * property to true.
     *
     * @since 1.5.0
     * @access public
     */
    public function the_post() {
        global $post;
        $this->in_the_loop = true;

        if ( $this->current_post == -1 ) // loop has just started
            /**
             * Fires once the loop is started.
             *
             * @since 2.0.0
             *
             * @param WP_Query &$this The WP_Query instance (passed by reference).
             */
            do_action_ref_array( ‘loop_start’, array( &$this ) );

        $post = $this->next_post();
        $this->setup_postdata( $post );
    }

Phương thức này có nghĩa là nó sẽ lập chỉ mục thứ tự của các bài viết trong vòng lặp và chức năng cụ thể là đặt thuộc tính in_the_loop thành true vì giá trị mặc định là false, và nếu nó là true thì phương thức next_post () có thể thực thi để lấy phần tiếp theo bài báo.

Vì vậy, kết luận, phương pháp này sẽ hoạt động đếm chỉ số để gọi bài tiếp theo trong vòng lặpnếu bạn không khai báo phương thức này trong vòng lặp thì bài viết đầu tiên sẽ được lặp đi lặp lại nhiều lần mà không dừng lại.

$ wp_query không cần khai báo trong vòng lặp

$ wp_query là đối tượng chứa truy vấn mặc định trên trang, vì vậy bạn có thể không cần gọi nó trong vòng lặp, nó sẽ hiểu rằng bạn đang lặp truy vấn mặc định.


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

            /*
             * Nội dung hiển thị bài viết
             */
            echo $post->post_title . ‘<br>’;

        endwhile; endif;
?>

Sử dụng thẻ mẫu trong một vòng lặp

Trong vòng lặp, nếu cần lấy thông tin bài viết ra, bạn không thể sử dụng đối tượng $ post mà chỉ cần khai báo các hàm của thẻ mẫu (xem bài trước). Nó sẽ hiểu rằng bạn lấy đối tượng trong truy vấn mà nó đang lặp lại (xem nội dung tệp /wp-includes/post-template.php Để biết thêm chi tiết).

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

            /*
             * Nội dung hiển thị bài viết
             */
            the_title();

        endwhile; endif;
?>

Ví dụ về một vòng lặp hoàn chỉnh

Bằng cách kết hợp với HTML, chúng ta có thể tạo một vòng lặp để lấy danh sách các bài đăng như sau:


<?php
    if( have_posts() ) : while ( have_posts() ) : the_post();
?> <!–Đóng PHP để viết HTML tiện hơn ở dưới–>

    <!–Nội dung một bài viết–>
    <article <?php post_class() ?> >
        <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
        <summary>
            <?php the_content(); ?>
        </summary>
        <footer>
            <?php the_tags(); ?>
        </footer>
    </article>
    <!–kết thúc nội dung–>

<?php endwhile; endif; // Kết thúc vòng lặp ?>

Tôi sẽ nói điều đó ngay tại đây, các thẻ như <article>,<summary>,<footer> cùng một thẻ <div> tốt, đó là các thẻ HTML5 để chúng trông có cấu trúc hơn.

Tạo một đối tượng truy vấn mới với WP_Query

Sau khi nhìn vào phần trên, bạn biết WordPress có một truy vấn mặc định trên mỗi trang được lưu trữ trong đối tượng $ wp_query. Nhưng may mắn thay, bạn có thể tạo nhiều đối tượng truy vấn khác với các tham số tùy chỉnh để có được bài viết như ý muốn, đó là chúng ta sẽ sử dụng lớp WP_Query.

Sử dụng

Cách sử dụng lớp này khá đơn giản, đó là tạo nó thành một biến dưới dạng đối tượng và khai báo các tham số (dạng mảng) để tùy biến bài viết.

$my_query = new WP_Query( $args );

Trong đó, $args là một biến chứa tham số. Ví dụ: tôi có thể khai báo các tham số và tạo một truy vấn như sau:


<?php
$args_my_query = array(
    ‘post_type’    =>    ‘post’,
    ‘orderby’    => ‘rand’
);
$my_query = new WP_Query( $args_my_query );
?>

Và sau đó bạn mang đối tượng $my_query chỉ cần đặt nó trong vòng lặp.


<?php
    if( $my_query->have_posts() ) : while( $my_query->have_posts() ) : $my_query->the_post();

            /*
             * Nội dung hiển thị bài viết
             */
            the_title();

        endwhile; endif;
?>

Ở đây tôi sẽ không nói về việc tạo một truy vấn mới với phân trang, nhưng tôi sẽ nói về điều này trong một bài viết riêng.

Danh sách các tham số của WP_Query

Sức mạnh của WP_Query nằm ở các tham số. Với số lượng thông số đa dạng và phong phú, bạn có thể lấy bất kỳ thể loại bài viết nào ở bất kỳ đâu trên website. Các thông số mình tổng hợp thành note, các bạn có thể tham khảo tại https://gist.github.com/thachpham92/d57b18cf02e3550acdb5.

Phần kết

Bài viết này có thể hơi dài, nhưng đó là điều quan trọng nhất của WP Query mà tôi muốn nói với bạn. Bằng cách nắm vững cách sử dụng WP Query và hiểu các câu truy vấn trong WordPress, bạn có thể làm được rất nhiều thứ vì hầu như trong WordPress chúng ta sử dụng WP Query rất nhiều.

4/5 – (4 bình chọn)

Tiếp tục đọc trong bộ truyện