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

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

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

К implment это я использую тег сообщений, и в futured отправляет область, которую я показываю сообщениям, имеющим 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');?>

Теперь моя проблема - это, если сообщение имеет 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; ?>

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

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

Почему это не работает? Что я пропускаю?

1
17.07.2014, 18:03
3 ответа

Существует несколько ошибок, которые я хочу исправить

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

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

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

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

В-третьих, если у Вас нет выбора, и необходимо выполнить пользовательские запросы, сделать это с 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' );
3
19.02.2020, 22:48
  • 1
    Tnx ответа, perferct explaination :-) –  AndreaNobili 20.07.2014, 20:24
  • 2
    Мое удовольствие, довольное, что я мог пролить некоторый свет на Вашу проблему. Наслаждайтесь :-) –  Pieter Goosen 20.07.2014, 20:25
  • 3
    Посмотрите мое редактирование.Это очень важно. Спасибо и жаль о любом беспорядке –  Pieter Goosen 28.07.2014, 13:26
<?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. не давайте имя тега к it.it, не будет работать с именем тега.

1
19.02.2020, 22:48

Решенный использованием myselfe:

<?
    // 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 )));
?>
-1
19.02.2020, 22:48
  • 1
    не использует query_posts когда-либо. Необходимо использовать WP_Query для Вашего пользовательского запроса и pre_get_posts для изменения основного –  Pieter Goosen 17.07.2014, 11:48

Теги

Похожие вопросы