it-swarm.com.de

Beiträge von der Homepage mit einem bestimmten Tag ausschließen

Ich bin ziemlich neu in der WordPress-Entwicklung und ich versuche, dieses benutzerdefinierte Thema zu implementieren, das die so genannten empfohlenen Beiträge behandelt

Wie Sie im Beitragsbereich der Homepage sehen können, habe ich den Articoli in evidenza Unterbereich, der meine empfohlenen Beiträge und darunter den Ultimi Articoli Unterbereich enthält enthält die neuesten Beiträge.

Um dies zu implementieren, verwende ich das Posts-Tag und zeige im Bereich "Zukünftige Posts" die Posts mit der Bedingung "tag=featured".

Das ist also mein Code:

<section id="blog-posts">

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

<?php query_posts('tag=featured');?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
  <div id="featured-posts">

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
      <div class="meta">
Scritto da <span class="author"><?php the_author_link(); ?></span> &nbsp;//&nbsp;  <?php the_category(', ') ?>  &nbsp;//&nbsp;  <?php comments_popup_link('Nessun Commento', '1 Commento ', '% Commenti'); ?> 
      </div>
      <div class="featured-details"><?php the_excerpt()?>
      <?php $featured_img = get_post_meta($post->ID, 'featured_img', $single = true); ?>
      <a href="<?php the_permalink(); ?>"><img src="<?php echo $featured_img ?>" alt="<?php the_title(); ?>" /></a>
      </div>
    </div>

<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>



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

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

Wie Sie zuerst sehen können, zeige ich die Beiträge mit einem Tag featured mit der Funktion query-posts():

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

Nun ist mein Problem, dass, wenn ein Beitrag das Tag featured hat, ich nicht möchte, dass es im neuesten Beitragsbereich angezeigt wird (zu diesem Zeitpunkt wird es angezeigt). Also habe ich versucht, diesen Code zu verwenden:

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

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

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
  <div id="featured-posts">

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
      <div class="meta">
Scritto da <span class="author"><?php the_author_link(); ?></span> &nbsp;//&nbsp;  <?php the_category(', ') ?>  &nbsp;//&nbsp;  <?php comments_popup_link('Nessun Commento', '1 Commento ', '% Commenti'); ?> 
      </div>
      <div class="featured-details"><?php the_excerpt()?>
      <?php $featured_img = get_post_meta($post->ID, 'featured_img', $single = true); ?>
      <a href="<?php the_permalink(); ?>"><img src="<?php echo $featured_img ?>" alt="<?php the_title(); ?>" /></a>
      </div>
    </div>

<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>

Aber das funktioniert nicht und die gezeigten Beiträge sind immer noch auf der Homepage zu sehen. Wie Sie sehen, habe ich versucht anzugeben, dass ein Beitrag nicht den Tag featured haben darf, um angezeigt zu werden:

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

Warum funktioniert das nicht? Was vermisse ich?

1
AndreaNobili

Es gibt ein paar Fehler, die ich ansprechen möchte

Zunächst sollten Sie niemals query_posts verwenden, um benutzerdefinierte Abfragen zu erstellen. Dies ist nicht nur mein Schwerpunkt, sondern auch der Kodex. Das einzige große Problem bei query_posts ist, dass unter vielen Umständen die Paginierung fehlschlägt

Hinweis:Diese Funktion ist nicht für Plugins oder Themes vorgesehen. Wie später erläutert, gibt es bessere, leistungsfähigere Optionen zum Ändern der Hauptabfrage. Mit query_posts () kann die Hauptabfrage einer Seite übermäßig vereinfacht und problematisch geändert werden, indem sie durch eine neue Instanz der Abfrage ersetzt wird. Es ist ineffizient (führt SQL-Abfragen erneut aus) und schlägt unter bestimmten Umständen (besonders häufig bei Seitenumbrüchen) fehl.

Führen Sie zweitens keine unnötigen Abfragen aus, wenn sie nicht benötigt werden. Die Hauptabfrage kann sehr einfach mithilfe von pre_get_posts geändert werden, wodurch unnötige Datenbankabfragen durch die Verwendung benutzerdefinierter Abfragen vermieden werden

Dieser Hook wird aufgerufen, nachdem das Abfragevariablenobjekt erstellt wurde, aber bevor die eigentliche Abfrage ausgeführt wird.

Drittens, wenn Sie keine Wahl haben und benutzerdefinierte Abfragen ausführen müssen, tun Sie dies mit WP_Query oder get_posts anstelle von query_posts

Außerdem missbrauchen Sie PHP-Tags. Es ist nicht notwendig, PHP-Tags nach jedem Code zu öffnen und zu schließen, es sei denn, Sie wechseln zwischen PHP und HTML. Zum Beispiel

 </div>
    </div>

<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>

</div>

kann umgeschrieben werden als

</div>
    </div>

<?php 
   endwhile;
   else :
   endif;
?>

</div>

So werde ich das Problem angehen. Ich sage nicht, dass es die beste Lösung ist, aber es ist eine bessere und sauberere Methode, um Ihr Ziel zu erreichen

Ihre erste Abfrage nach Ihren vorgestellten Inhalten sollte ungefähr so ​​aussehen

<section id="blog-posts">

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

<?php 

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

if ($featured->have_posts()) : 
  while ($featured->have_posts()) : $featured->the_post(); ?>

   <---YOUR LOOP ELEMENTS--->

<?php 
  endwhile; 

  wp_reset_postdata();

endif; 
?>

Deine Hauptschleife ist in Ordnung, daran werde ich nichts ändern.NICHTVerwenden Sie hier eine benutzerdefinierte Abfrage, um ein Tag auszuschließen. Verwenden Sie dazu pre_get_posts. Hier ist, wie

Fügen Sie in der Datei functions.php den folgenden Code hinzu, um Beiträge aus dem hervorgehobenen Tag aus der Hauptabfrage auf Ihrer Homepage zu entfernen. Sie verwenden das Tag is_home() conditional, um auf die Homepage zuzugreifen

EDIT

Ich habe vergessen, dies einzuschließen. Es ist immer ausfallsicher, eine Prüfung einzuschließen, um festzustellen, ob Sie sich nicht auf einer Administrationsseite befinden (!is_admin()). Der Grund dafür ist, dass pre_get_posts die Hauptabfrage ändert, die sowohl im Front-End als auch im Back-End verwendet wird, sodass alle Änderungen im Front-End und im Back-End angezeigt werden. Sie möchten nur Änderungen am Front-End vornehmen, der geänderte Code wird also übernommen

function exclude_featured_tag( $query ) {
    if ( !is_admin() && $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' );
3
Pieter Goosen
<?php
$args = array(
'posts_per_page' => 5,
'cat' => 2,
'tag__not_in' => array(5), // Assuming 5 is the ID for the tag
'order' => 'asc'
 );

 $query = new WP_Query($args);
 while ($query->have_posts()) :
 $query->the_post();

 ...

  endwhile;
   // don't forget to reset/restore the query
   wp_reset_postdata();

 ?>

stellen Sie sicher, dass Sie tag_not_in die Tag-ID-Nummer geben müssen. Geben Sie ihm keinen Tag-Namen. Es funktioniert nicht mit Tag-Namen.

1
Zammuuz