Ich bin ziemlich neu in der Entwicklung von WordPress-Themes und ich bin nicht so in PHP (ich kam aus Java und C #) und habe die folgende Situation in diesem benutzerdefinierten Theme
Wie Sie auf der Homepage sehen können, zeige ich zuerst einen Abschnitt (mit dem Namen Articoli in evidenza ), der die vorgestellten Beiträge enthält (ich habe ihn mit einem bestimmten Tag implementiert), und darunter befindet sich ein weiterer Bereich (mit dem Namen Ultimi Articoli ), der den neuesten Beitrag enthält Das sind nicht die vorgestellten Post.
Dazu benutze ich diesen Code:
<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>
Es funktioniert gut, aber ich habe einige Zweifel an der Qualität dieser Lösung und wie genau sie funktioniert.
Um alle vorgestellten Beiträge auszuwählen , verwende ich diese Zeile, die ein neues WP_Query
Objekt erstellt, das eine Abfrage mit dem spezifischen Tag definiert featured
:
$featured = new WP_Query('tag=featured');
Dann iteriere ich dieses Abfrageergebnis mit seiner have_posts()
Methode.
Soweit ich weiß, handelt es sich nicht um die WordPress-Hauptabfrage, sondern um eine neue Abfrage, die von mir erstellt wurde. Soweit ich weiß, ist es besser, eine neue Abfrage zu erstellen (wie getan) und nicht die Hauptabfrage zu verwenden, wenn ich diese Art von Operation ausführen möchte.
Ist es wahr oder fehle ich etwas? Wenn es wahr ist, können Sie mir erklären, warum es besser ist, eine neue benutzerdefinierte Abfrage zu erstellen und die Wordpress-Hauptabfrage nicht zu ändern?
Ok, mach weiter. Ich zeige alle Beiträge, die nicht das Tag "Hervorgehoben" haben. Dazu verwende ich diesen Codeausschnitt, der im Gegenteil die Hauptabfrage modifiziert:
<?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;
?>
Also ich denke, das ist ziemlich schrecklich. Ist es wahr?
AKTUALISIEREN:
Um den gleichen Vorgang auszuführen, habe ich diese Funktion (in der großartigen Antwort unten) gefunden, die ich zu functions.php hinzugefügt habe
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' );
Diese Funktion verfügt über einen Hook, der aufgerufen wird, nachdem das Abfragevariablenobjekt erstellt wurde, aber bevor die eigentliche Abfrage ausgeführt wird.
Soweit ich weiß, wird ein Abfrageobjekt als Eingabeparameter verwendet und geändert (tatsächlich gefiltert), indem alle Posts mit Ausnahme eines bestimmten Tags (in meinem Fall die featured
Tag-Posts) ausgewählt werden.
Wie kann ich die vorherige Abfrage (die zum Anzeigen der vorgestellten Beiträge verwendet wurde) mit dieser Funktion verwenden, um nur die nicht vorgestellten Beiträge in meinem Thema anzuzeigen? Oder muss ich eine neue Abfrage erstellen?