it-swarm-eu.dev

Některé pochybnosti o tom, jak hlavní dotaz a vlastní dotaz funguje v tomto vlastním motivu?

Jsem docela nový ve vývoji WordPress témat a nejsem tak do PHP (jsem přišel z Java a C #) a mají následující situaci v tento vlastní motiv

Jak vidíte na domovské stránce, nejprve zobrazuji sekci (pojmenovanou Articoli in evidenceenza) obsahující featured posts (implementoval jsem ji pomocí konkrétní značky) a pod ní je další oblast (pojmenovaná Ultimi Articoli), která obsahuje poslední příspěvek, který není uváděným příspěvkem.

K tomuto účelu používám tento kód:

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

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

Funguje to dobře, ale mám pochybnosti o kvalitě tohoto řešení a jak přesně to funguje.

Chcete-li vybrat všechny uváděné příspěvky, používám tento řádek, který vytvoří nový objekt WP_Query, který definuje dotaz se specifickou značkou featured:

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

Pak na tomto výsledku dotazu použiji metodu have_posts().

Takže, z toho, co jsem pochopil, to není hlavní dotaz WordPress, ale je to nový dotaz vytvořený mnou. Z toho, co jsem pochopil, je lepší vytvořit nový dotaz (jako hotovo) a nepoužívat hlavní dotaz, když chci provést tento druh operace.

Je to pravda, nebo mi něco chybí? Pokud je to pravda, můžete mi vysvětlit, proč je lepší vytvořit nový vlastní dotaz a nemění hlavní dotaz Wordpress?

Ok, děje. Zobrazuji všechny příspěvky, které nemají zobrazenou značku, a to pomocí tohoto fragmentu kódu, který naopak mění hlavní dotaz:

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

Takže si myslím, že je to dost hrozné. Je to pravda?

Pro provedení stejné operace jsem našel tuto funkci, kterou jsem přidal do function.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' );

Tato funkce má hák, který je volán po vytvoření objektu proměnné dotazu, ale před spuštěním skutečného dotazu.

Takže z toho, co jsem pochopil, vezme objekt dotazu jako vstupní parametr a upraví ho tak, že vybere všechny příspěvky s výjimkou konkrétní značky (v mém případě příspěvků featured tagů)

Jak tedy mohu použít předchozí dotaz (ten, který se používá k zobrazení doporučených příspěvků) s touto funkcí, aby se v mém motivu nezobrazil příspěvek, který není zobrazen? Nebo musím vytvořit nový dotaz?

19
AndreaNobili

Vaše skutečná otázka je v podstatě kdy spustit vlastní dotaz a kdy použít hlavní dotaz. Pojďme to rozdělit na tři části

PART ONE

Kdy spustit vlastní dotaz (Toto není definitivní seznam)

  • Vytvoření vlastních posuvníků obsahu

  • Chcete-li na stránce vytvořit oblast doporučeného obsahu

  • Pokud chcete zobrazit příspěvky, klepněte na šablony page.php

  • Pokud požadujete vlastní obsah na statické přední stránce

  • Zobrazit související, populární nebo informační příspěvky

  • Jakýkoli jiný sekundární nebo doplňkový obsah mimo rozsah hlavního dotazu

Kdy použít hlavní dotaz.

Chcete-li zobrazit primární obsah

ČÁST TWO

Chcete-li vybrat všechny doporučené příspěvky, používám tento řádek, který vytvoří nový objekt WP_Query, který definuje dotaz obsahující konkrétní značku:

Takže z toho, co jsem pochopil, to není hlavní dotaz WordPres, ale je to nový dotaz vytvořený mnou. Z toho, co jsem pochopil, je lepší vytvořit nový dotaz (jako hotový) a nepoužívat hlavní dotaz, když chci provést tento druh operací

Opravit. To spadá mimo rozsah hlavního dotazu. Toto je sekundární nebo doplňkový obsah, který nelze vytvořit s hlavním dotazem. BY MĚLI VŽDY použít buď WP_Query nebo get_posts pro vytvoření vlastních dotazů.

NIKDY NEPOUŽÍVEJTE query_posts pro vytvoření vlastních dotazů, ani žádných jiných dotazů. Můj důraz.

Poznámka: Tato funkce nemá být používána zásuvnými moduly nebo tématy. Jak bylo vysvětleno později, existují lepší, výkonnější možnosti, jak změnit hlavní dotaz. query_posts () je příliš zjednodušující a problematický způsob, jak změnit hlavní dotaz na stránku tím, že jej nahradí novou instancí dotazu. Je neefektivní (znovu spouští dotazy SQL) a za určitých okolností bude zcela neúspěšné (obzvláště často, když se jedná o stránkování stránek).

Posouvat se

Ok, zobrazením všech příspěvků, které nemají zobrazenou značku, zobrazuji všechny příspěvky, které tento hlavní fragment upravují.

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

Takže si myslím, že je to dost hrozné. Je to pravda?

To je vše špatně a tvé prohlášení je bohužel pravda. Jak již bylo řečeno,NIKDYuse query_posts. Spouští kompletní nový dotaz, což je špatné pro výkon, a většina případů přeruší stránkování, které je nedílnou součástí hlavního dotazu pro správné fungování stránkování.

Toto je váš primární obsah, takže byste měli používat hlavní dotaz s výchozí smyčkou, která by měla vypadat takto, a to je vše, co potřebujete

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

Můžete se této části zcela zbavit, smazat, vypálit a zapomenout na ni

<?
// 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, jakmile to uděláte, uvidíte, že příspěvky z tagu funkce se objeví na domovské stránce pomocí hlavního dotazu a výchozí smyčky.

Správný způsob odstranění této značky z domovské stránky je pomocí pre_get_posts . Toto je správný způsob, jak změnit hlavní dotaz a háček, který byste měli always use použít k provedení změn ve smyčce primárního obsahu.

Takže kód s pre_get_posts je správný a je to funkce, kterou byste měli použít. Jen jedna věc, vždy proveďte kontrolu, že nejste na stránce administrátora, protože pre_get_posts mění také zadní konec. Toto je tedy správný kód, který chcete použít v functions.php k odstranění příspěvků označených featured z domovské stránky

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] );
    }
}

ČÁST TŘETÍ

Extra čtecí materiál, který bude v budoucnu užitečný

31
Pieter Goosen