Исключить сообщения с главной страницы с указанным тегом

Я довольно новичок в разработке WordPress, и я пытаюсь реализовать эту настраиваемую тему, которая обрабатывает так называемые признанные сообщения

Как вы можете видеть в области сообщений на главной странице, у меня есть подкатегория Articoli в evidenza, которая содержит мои избранные сообщения, а под ним – подрайон Ultimi Articoli , содержащий последние сообщения.

Чтобы внедрить это, я использую тег posts, а в области futured posts я показываю сообщения, имеющие условие tag=featured .

Итак, это мой код:

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

Как вы можете видеть, сначала я показываю сообщения с тегом, которые featured с помощью функции query-posts() :

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

Теперь моя проблема заключается в том, что если у столбца есть тег с признаками, я не хочу, чтобы он отображался в последней почтовой области (на данный момент это показано). Поэтому я попытался использовать этот код:

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

Но это не работает, и показанные сообщения все еще отображаются на главной странице. Как вы можете видеть, я попытался указать, что для показа сообщение не может иметь признак:

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

Почему это не работает? Что мне не хватает?

Solutions Collecting From Web of "Исключить сообщения с главной страницы с указанным тегом"

Есть несколько ошибок, которые я хочу решить

Прежде всего, вы никогда не должны использовать query_posts для создания пользовательских запросов. Это не только мой акцент, но и код. Одна большая проблема с query_posts заключается в том, что многие обстоятельства, разбиение на страницы не удается

Примечание. Эта функция не предназначена для использования плагинами или темами. Как поясняется ниже, есть более эффективные, более эффективные варианты для изменения основного запроса. query_posts () является слишком упрощенным и проблематичным способом изменения основного запроса страницы путем замены его новым экземпляром запроса. Он неэффективен (повторно запускает SQL-запросы), и в некоторых случаях он будет неудачным (особенно часто при работе с разбивкой по страницам).

Во-вторых, никогда не запускайте ненужные запросы, где это не нужно. Основной запрос может быть легко изменен с использованием pre_get_posts , что избавляет от ненужных запросов к базе данных, выполняемых с помощью пользовательских запросов

Этот hook вызывается после создания объекта переменной запроса, но до запуска фактического запроса.

В-третьих, если у вас нет выбора, и вам нужно запускать пользовательские запросы, сделайте это с помощью WP_Query или get_posts вместо query_posts

Кроме того, вы злоупотребляете тегами php. Нет необходимости открывать и закрывать теги php после каждого фрагмента кода, если вы не переключаетесь между php и html. Например

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

можно переписать как

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

Вот как я смогу решить эту проблему. Я не говорю, что это лучшее решение, но это лучший и более чистый метод для достижения вашей цели

Ваш первый запрос для вашего отображаемого контента должен выглядеть примерно так:

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

Ваша основная петля прекрасна, как есть, я ничего не буду с этим поделать. НЕ используйте специальный запрос здесь, чтобы исключить тег. Для этого используйте pre_get_posts . Вот как

В свой файл functions.php добавьте следующий код, чтобы удалить сообщения из признака с основного запроса на вашей домашней странице. Вы будете использовать условный тег is_home() для целевой страницы

РЕДАКТИРОВАТЬ

Я забыл включить это. Всегда ли безопасно включать проверку, чтобы убедиться, что вы не на странице администратора ( !is_admin() ). Причина в том, что pre_get_posts изменяет основной запрос, который используется как на лицевой стороне, так и на бэкэнд, таким образом, все изменения будут видны передним и задним концами. Вы просто хотите внести изменения на лицевой стороне, поэтому измененный код будет

 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' ); 

Надеюсь это поможет

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

убедитесь, что вы должны указать номер идентификатора тега tag_not_in. dont дать имя тега it.it не будет работать с именем тега.

Решила сама, используя:

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