Поддержка Проблемы и решения Показ поста в RSS только если есть postmeta

  • Доброго времени суток, уважаемые специалисты.

    Подскажите, пожалуйста, как показывать в RSS ленте только те посты, в которых введён «пользовательский тип записи», к примеру, rss-on и значение 1.

    Дабы в неё не попадали все опубликованные\обновлённые статьи, а только указанные.

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Модератор Yuri

    (@yube)

    Так все-таки postmeta или пользовательский тип записи?

    Подавляющее большинство задач по модификации выборки решается использованием обработчика хука ‘pre_get_posts’
    Матчасть: https://developer.wordpress.org/reference/hooks/pre_get_posts/
    Как-то так:

    add_filter('pre_get_posts', function($query) {
      if ($query->is_feed) {
    // доп.условия
      }
      return $query;
    });
    

    Юрий

    Спасибо, что откликнулись.

    Значение произвольного поля я имел в виду. Т.е. если в записи вставлено rss-on и значение 1, то показывать её в RSS ленте (и другие записи, где тоже вставлено в в произвольное поле значение rss-on и значение 1).

    Т.е. фильтр этот только для RSS ленты. Я гуглил-перегуглил и всё, что я нашёл, это:

    Исключение из фида постов имеющих произвольно поле

    add_filter( 'posts_where', 'exclude_special_posts_from_feed' );
    function exclude_special_posts_from_feed($where){
    	// Выходим если это не фид.
    	if( ! is_feed() || ! is_main_query() )
    		return $where;
    
    	global $wpdb;
    
    	$where .= " AND $wpdb->posts.ID NOT IN ( 
    						SELECT distinct(post_id) from $wpdb->postmeta 
    						where $wpdb->postmeta.meta_key = 'exclude_from_feed'
    						) ";
    
    	return $where;
    }

    Но тут исключение, если есть определённая запись «произвольного поля». А мне необходимо наоборот — исключение всех и включение ТОЛЬКО тех, что имеют конкретную запись произвольного поля. Такая кастомная RSS ленточка получается в итоге.

    Как это можно сделать?

    Я ещё крайне активно поискал и нашёл вот этот код:

    // Loop starts here
    while (have_posts()) : the_post();
    // Get the meta field
    $meta = get_post_meta($post->ID, "Meta Name", false);
    // Do no show post if the meta equals "Meta Value"
    if($meta != "Meta Value"){
    // Content Here
    }
    endwhile;
    // Loop ends

    И в файле feed-rss2.php узрел вот этот код, куда вроде как можно его вписать:

    while ( have_posts() ) :
        the_post();
        ?>
      <item>
        <title><?php the_title_rss(); ?></title>
        <link><?php the_permalink_rss(); ?></link>
        <?php if ( get_comme...
    ...
    .....ments_number(); ?></slash:comments>
        <?php endif; ?>
        <?php rss_enclosure(); ?>
        <?php
        /**
         * Fires at the end of each RSS2 feed item.
         *
         * @since 2.0.0
         */
        do_action( 'rss2_item' );
        ?>
      </item>
      <?php endwhile; ?>

    Как его правильно отредактировать (в приведённом выше коде при наличии записи произвольного поля возникает исключение, но можно же сделать обратный алгоритм, вроде для этого восклицательный знак надо убрать?) и вписать в приведённый далее код формирования RSS ленты? И да, при написании статьи, в меню ввода произвольного поля что нужно вписывать в Имя и Значение что бы сработало.

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Тема «Показ поста в RSS только если есть postmeta» закрыта для новых ответов.