Beberapa keraguan tentang bagaimana query utama dan karya-karya permintaan kustom dalam tema kustom ini?

20

Saya cukup baru dalam pengembangan tema WordPress dan saya tidak begitu ke PHP (saya berasal dari Jawa dan C #) dan memiliki situasi berikut dalam tema khusus ini

Seperti yang dapat Anda lihat di beranda, saya pertama kali menunjukkan bagian (bernama Articoli in proofenza ) yang berisi posting unggulan (saya sudah menerapkannya menggunakan tag tertentu) dan di bawahnya ada area lain (bernama Ultimi Articoli ) yang berisi posting terbaru itu bukan posting unggulan.

Untuk melakukannya saya menggunakan kode ini:

<section id="blog-posts">

<header class="header-sezione">
        <h2>Articoli in evidenza</h2>
</header>

<!--<?php query_posts('tag=featured');?>-->

<?php
    $featured = new WP_Query('tag=featured');

    if ($featured->have_posts()) : 
            while ($featured->have_posts()) : $featured->the_post();
            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
                 get_template_part('content', get_post_format());

             endwhile;
        wp_reset_postdata();
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>


<header class="header-sezione">
    <h2>Ultimi Articoli</h2>
</header>

<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>

</section>

Ini berfungsi dengan baik, tapi saya ragu tentang kualitas solusi ini dan bagaimana cara kerjanya.

Untuk memilih semua posting unggulan , saya menggunakan baris ini yang membuat WP_Queryobjek baru yang mendefinisikan kueri yang memiliki tag spesifik featured:

$featured = new WP_Query('tag=featured');

Kemudian saya mengulangi hasil permintaan ini menggunakan have_posts()metode.

Jadi, dari apa yang saya mengerti, ini bukan permintaan utama WordPress, tetapi ini adalah permintaan baru yang saya buat. Dari apa yang saya mengerti, lebih baik membuat kueri baru (seperti yang dilakukan) dan tidak menggunakan kueri utama ketika saya ingin melakukan operasi semacam ini.

Apakah itu benar, atau saya kehilangan sesuatu? Jika itu benar, dapatkah Anda menjelaskan kepada saya, mengapa lebih baik membuat kueri khusus baru dan tidak mengubah kueri utama Wordpress?

Ok, lanjutkan. Saya menunjukkan semua posting yang tidak memiliki tag 'fitur'. Untuk melakukan ini, saya menggunakan cuplikan kode ini, yang sebaliknya, memodifikasi kueri utama:

    <?php
    // get the term using the slug and the tag taxonomy
    $term = get_term_by( 'slug', 'featured', 'post_tag' );
    // pass the term_id to tag__not_in
    query_posts( array( 'tag__not_in' => array ( $term->term_id )));
    ?>

    <?php
        if (have_posts()) :
            // Start the Loop.
            while (have_posts()) : the_post();
                get_template_part('content', get_post_format());

            endwhile;
        else :
            // If no content, include the "No posts found" template.
            get_template_part('content', 'none');

        endif;
        ?>

Jadi saya pikir, ini sangat mengerikan. Apakah itu benar

MEMPERBARUI:

Untuk melakukan operasi yang sama saya menemukan fungsi ini (dalam jawaban yang bagus di bawah) yang telah saya tambahkan ke functions.php

function exclude_featured_tag( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
    }
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );

Fungsi ini memiliki pengait yang dipanggil setelah objek variabel kueri dibuat, tetapi sebelum kueri yang sebenarnya dijalankan.

Jadi, dari apa yang saya mengerti, dibutuhkan objek permintaan sebagai parameter input dan memodifikasi (sebenarnya memfilter) dengan memilih semua posting tidak termasuk tag tertentu (dalam kasus saya featuredposting tag)

Jadi, bagaimana saya bisa menggunakan kueri sebelumnya (yang digunakan untuk menampilkan posting unggulan) dengan fungsi ini untuk hanya menampilkan posting tidak ditampilkan dalam tema saya? Atau apakah saya harus membuat permintaan baru?

AndreaNobili
sumber

Jawaban:

33

Pertanyaan aktual Anda pada dasarnya adalah kapan harus menjalankan kueri khusus dan kapan harus menggunakan kueri utama. Mari kita memecahnya menjadi tiga bagian

BAGIAN SATU

Kapan menjalankan kueri khusus (Ini bukan daftar definitif)

  • Untuk membuat bilah konten khusus

  • Untuk membuat area konten unggulan di halaman

  • Templat page.php jika Anda perlu menampilkan posting

  • Jika Anda memerlukan konten khusus di halaman depan statis

  • Tampilkan tulisan terkait, populer, atau informasi

  • Konten sekunder atau tambahan lainnya di luar ruang lingkup permintaan utama

Kapan memanfaatkan kueri utama.

Untuk menampilkan konten utama pada

BAGIAN KEDUA

Untuk memilih semua posting unggulan, saya menggunakan baris ini yang membuat objek WP_Query baru yang mendefinisikan kueri yang memiliki tag khusus ditampilkan:

Jadi, dari apa yang saya mengerti, ini bukan permintaan utama WordPres tetapi ini adalah permintaan baru yang saya buat. Dari apa yang saya pahami, lebih baik buat query baru (selesai) dan tidak menggunakan query utama ketika saya ingin melakukan operasi semacam ini

Benar. Ini tidak termasuk ruang untuk kueri utama. Ini adalah konten sekunder atau tambahan yang tidak dapat dibuat dengan permintaan utama. Anda HARUS SELALU menggunakan salah satu WP_Queryatau get_postsuntuk membuat kueri khusus.

JANGAN PERNAH GUNAKAN query_posts untuk membuat kueri khusus, atau bahkan kueri lainnya. Penekanan saya.

Catatan: Fungsi ini tidak dimaksudkan untuk digunakan oleh plugin atau tema. Seperti yang dijelaskan nanti, ada opsi yang lebih baik, lebih banyak performan untuk mengubah kueri utama. query_posts () adalah cara yang terlalu sederhana dan bermasalah untuk memodifikasi kueri utama dari suatu halaman dengan menggantinya dengan instance kueri yang baru. Itu tidak efisien (menjalankan kembali query SQL) dan akan langsung gagal dalam beberapa keadaan (terutama sering ketika berhadapan dengan posting pagination).

Bergerak

Oke, saya menunjukkan semua posting yang belum memiliki tag unggulan, untuk melakukan ini saya menggunakan cuplikan kode ini yang sebaliknya memodifikasi permintaan utama:

query_posts( array( 'tag__not_in' => array ( $term->term_id )));

Jadi saya pikir ini cukup mengerikan. Apakah itu benar

Itu semua salah dan pernyataan Anda sayangnya benar. Seperti yang dikatakan sebelumnya, JANGAN PERNAH digunakan query_posts. Ini menjalankan kueri baru yang lengkap, yang buruk untuk kinerja, dan sebagian besar kasus memecah pagination yang merupakan bagian integral dari permintaan utama untuk pagination agar berfungsi dengan benar.

Ini adalah konten utama Anda, jadi Anda harus menggunakan kueri utama dengan loop default, yang akan terlihat seperti ini, dan ini yang Anda butuhkan

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
?>

Anda dapat sepenuhnya menghapus bagian ini, menghapusnya, membakarnya, dan melupakannya

<?
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

OK, setelah Anda selesai melakukannya, Anda akan melihat bahwa kiriman dari tag fitur muncul di beranda Anda menggunakan kueri utama dan loop default.

Cara yang benar untuk menghapus tag ini dari beranda adalah dengan pre_get_posts. Ini adalah cara yang tepat untuk mengubah kueri utama dan pengait yang harus selalu Anda lakukan gunakan untuk membuat perubahan pada loop konten utama Anda.

Jadi, kode dengan pre_get_postssudah benar dan ini adalah fungsi yang harus Anda gunakan. Hanya satu hal, selalu lakukan pengecekan bahwa Anda tidak berada di halaman admin karena pre_get_postsmengubah bagian belakang juga. Jadi ini adalah kode yang tepat untuk digunakan dalam functions.phpposting menghapus tagged fitur dari homepage

add_action( 'pre_get_posts', 'exclude_featured_tag' );
function exclude_featured_tag( $query ) 
{
    if (    !is_admin() 
         && $query->is_home() 
         && $query->is_main_query() 
    ) {
        $query->set( 'tag__not_in', [ID OF THE FEATURED TAG] );
    }
}

BAGIAN KETIGA

Bahan bacaan ekstra yang akan membantu di masa depan

Pieter Goosen
sumber
Dengan senang hati. Senang Anda menemukannya bermanfaat. Enjou :-)
Pieter Goosen
Wow, jawaban yang cukup! Saya kehilangan satu informasi penting: bagaimana cara memberi tahu WP "ini halaman posting" di samping halaman posting utama? Katakanlah saya ingin satu daftar posting dengan kategori 10,11,12 dan daftar lain dengan kategori 13,14,15. Saya melihat bagaimana saya bisa menggunakan pre_get_posts untuk menyuntikkan kategori ke dalam permintaan utama, tetapi bagaimana saya bisa memberi tahu WP untuk menjadikannya sebagai daftar posting dengan pagination yang tepat? Apakah saya benar-benar harus mengikuti jawaban Anda yang luas di sini wordpress.stackexchange.com/a/215027/74134 karena itu adalah Halaman? Tentunya WordPress secara alami memungkinkan untuk beberapa daftar blog di suatu situs?
Mark Berry