Как показать содержимое страницы в фиде?

13

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

Я хочу, чтобы при вводе http://swissaudio.com/craftsmanship/feedон предоставлял мне содержимое страницы в фиде. Как я могу это сделать?

Raxa
источник
просто чтобы быть уверенным, вы спрашиваете, нужно ли показывать весь контент ваших сообщений в ленте, а не просто сводку, или же добавить все страницы (post_type of page) в ленту новостей в полном объеме?
Мэйджик
@majick Я хочу показать все содержимое страницы в фиде. Я также использую этот код, но результат меняется add_filter('request', 'feed_request'); function feed_request($qv){ $rss_post_types = array('post', 'page'); if(isset($qv['feed']) && !isset($qv['post_type'])) $qv['post_type'] = $rss_post_types; return $qv; }
raxa
на первый взгляд все выглядит нормально, убедитесь, что вы отключили все тестируемые плагины, а также отключили кэши во время тестирования.
Мэйджик
@majick из-за вышеописанной работы с фидом кода для домашней страницы. Пожалуйста, проверьте этот сайт. http://swissaudio.com/feed/Я хочу показать содержимое каждой страницы в фиде, то есть для craftsmanshipстраницы, которую я хотел бы сделать что-то подобное, http://swissaudio.com/craftsmanship/feed/но это не
дает
3
это оказалось очень сложным, я проверил еще несколько вещей без удачи, поэтому открыл награду за это, так как я хотел бы узнать решение самостоятельно. :-)
Мейджик

Ответы:

7

Сначала установите тип записи для отображения на главной странице, т. Е. С /feedпомощью pre_get_postsкрючка

$q->set('post_type', array('post', 'page'));

На отдельной странице WordPress показывает ленту комментариев, затем устанавливает ее falseи отображает содержимое страницы в ленте.

$q->is_comment_feed = false;

В шаблоне фида WordPress звонки, the_excerpt_rss()которые get_the_excerpt()с помощью excerpt_lengthфильтра изменяют длину до макс.

Полный пример: -

add_action('pre_get_posts', 'wpse_227136_feed_content');
/**
 * Set post type in feed content and remove comment feed
 * @param type $q WP Query
 */
function wpse_227136_feed_content($q) {
    //Check if it main query and for feed
    if ($q->is_main_query() && $q->is_feed()) {
        //Set the post types which you want default is post
        $q->set('post_type', array('post', 'page'));
    }

    //Check if it feed request and for single page 
    if ($q->is_main_query() && $q->is_feed() && $q->is_page()) {
        //Set the comment feed to false
        $q->is_comment_feed = false;
    }
}

add_filter( 'excerpt_length', 'wpse_227136_excerpt_length', 999 );
/**
 * Filter the except length to full content.
 *
 * @param int $length Excerpt length.
 * @return int $length modified excerpt length.
 */
function wpse_227136_excerpt_length( $length ) {
    if (is_feed() && !get_option('rss_use_excerpt')) {
        return PHP_INT_MAX;
    }

    return $length;
}
Sumit
источник
ааа комментарии по умолчанию в true. Итак, это все..! Что ж, казалось бы, имеет смысл, если делать это, /page/comments/feed/вместо этого показывать комментарии, есть идеи, как это сделать?
Мэйджик
Ну, я думаю, для этого нам нужно добавить новые правила переписывания. Поскольку WP не поддерживает его по умолчанию, вместо этого он поддерживает строку запроса, withoutcomments=1на которую отвечает cjbj. Я не очень хорош в переписывании URL: D
Sumit
1
не очень хорошо с переписыванием URL, решил изменить его и добавить поддержку для withcomments=1моего ответа.
Мейджик
для длины фильтра выдержки, она должна не проверить , get_option('rss_use_excerpt')не !get_option('rss_use_excerpt)потому что , если это уже ложь длина Отрывка фильтр не будет нужен, он будет отображать полное содержание уже. O_o
majick
Ну, я не уверен почему, но если вы проверите эту строку core.trac.wordpress.org/browser/tags/4.5/src/wp-include/… в шаблоне, это не повлияет на этот параметр, поэтому я просто исправляю что он должен делать.
Sumit
4

Это не может быть идеальным, но это начало. Сначала убедитесь, что весь контент находится в ленте:

function fullcontentfeed($content) {
    global $post;
    $content = $post->post_content;
    return $content;
    }
add_filter('the_excerpt_rss', 'fullcontentfeed');

Вы должны увидеть полный канал по этому URL

http://swissaudio.com/craftsmanship/feed/?withoutcomments=1

Затем вы можете использовать add_rewrite_ruleдля перенаправления посетителей из / feed /. Далеко от идеала, но, может быть, это начало для кого-то еще, чтобы работать.

cjbj
источник
использование return get_the_content_feed()было бы лучше, потому что оно также применяет the_contentфильтры ... но, к сожалению, это выводит весь контент в поле описания фида, а не в поле контента.
Мэйджик
3

Как уже упоминалось @Sumit, вам нужно отключить ленту комментариев для страницы (что я нахожу действительно странным, так как по умолчанию комментарии отключены на страницах?) ... это то, чем я закончил (позволяя получать комментарии страницы кормить, ?withcomments=1если хотите):

add_action('pre_get_posts', 'rss_page_feed_full_content');

function rss_page_feed_full_content($q) {
    // Check if it feed request and for single page
    if ($q->is_main_query() && $q->is_feed() && $q->is_page()) {
        //Set the comment feed to false
        $q->set('post_type', array('page'));
        // allow for page comments feed via ?withcomments=1
        if ( (isset($_GET['withcomments'])) && ($_GET['withcomments'] == '1') ) {return;}
        $q->is_comment_feed = false;
    }
}

Но для отображения содержимого страницы, поскольку шаблон канала фактически проверяет, rss_use_excerptследует ли отображать полный текст или сводку (задается в меню «Настройки» -> «Чтение»), его необходимо переопределить, если вы хотите, чтобы весь контент отображался для канала страницы ( так что вы можете иметь основной параметр для сообщений, которые вам нравятся.) В противном случае все, что вы делаете, может оказаться в поле описания канала вместо поля контента.

add_filter('pre_option_rss_use_excerpt', 'page_rss_excerpt_option');

function page_rss_excerpt_option($option) {
    // force full content output for pages
    if (is_page()) {return '0';}
    return $option;
}

И, наконец, чтобы в поле описания RSS отображался отрывок страницы, вам, возможно, придется сделать это (что по сути является копией wp_trim_excerptбез strip_shortcodes) - ну, я все равно это сделал, но это может быть связано со странным поведением шорткода на странице, которую я было тестирование:

add_filter('the_excerpt_rss','rss_page_excerpt');

function rss_page_excerpt($excerpt) {
    if (is_page()) {
        global $post; $text = $post->post_content;
        // removed this line otherwise got blank
        // $text = strip_shortcodes( $text );
        $text = apply_filters( 'the_content', $text );
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters( 'excerpt_length', 55 );
        $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[…]' );
        $excerpt = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return $excerpt;
}
majick
источник
О, я действительно сожалею: D withoutcommentsЯ сошел с ума, я читал это сейчас, я вижу это withcomment: D LOL удаляя мои комментарии;)
Sumit
никакие пробники, это точно не изумило мой разум.
Мэйджик