Jak wyświetlić zawartość strony w kanale?

13

Chcę wyświetlić całą zawartość każdej strony w kanale. Poszukuję jej i znalazłem wtyczkę, ale nie mogłem rozwiązać problemu.

Chcę, gdy wejdę http://swissaudio.com/craftsmanship/feed, zapewnia mi zawartość strony w kanale. Jak mogę to zrobić?

raxa
źródło
dla pewności, czy pytasz, czy wyświetlić całą treść swoich postów w kanale, a nie tylko podsumowanie, czy też dodać wszystkie strony (typ postu strony) do kanału w całości?
majick
@majick Chcę pokazać całą zawartość strony w kanale. Używam tego kodu również, ale zmiana wyniku zachodzi 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
na pierwszy rzut oka wygląda na to, że powinno działać dobrze, upewnij się, że wyłączyłeś wszystkie testowane wtyczki, a także wyłączasz pamięć podręczną podczas testowania.
majick
@majick z powodu powyższego kodu działa na stronie głównej. proszę sprawdzić tę stronę http://swissaudio.com/feed/Chcę pokazać zawartość każdej strony w kanale tzn. dla craftsmanshipstrony chciałbym zrobić coś takiego, http://swissaudio.com/craftsmanship/feed/ale nie pokazuje żadnego rezultatu
raxa
3
okazało się to bardzo trudne. Przetestowałem jeszcze kilka rzeczy bez powodzenia, więc otworzyłem nagrodę za to, ponieważ sam chciałbym poznać rozwiązanie. :-)
majick

Odpowiedzi:

7

Najpierw ustaw typ postu, aby wyświetlał się na głównej stronie kanału, tzn. /feedUżywając pre_get_postshaka

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

Na poszczególnych stronach WordPress wyświetla kanał komentarzy, a następnie ustaw go falsei wyświetl zawartość strony w kanale.

$q->is_comment_feed = false;

W szablonie kanału wywołania WordPress, the_excerpt_rss()które wywołania, get_the_excerpt()więc za pomocą excerpt_lengthfiltra zmień długość na maks.

Kompletny przykład: -

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
źródło
ahh komentarze domyślnie na true. więc to jest to..! no cóż, wydaje się sensowne, aby zrobić to, /page/comments/feed/co faktycznie pokazałoby komentarze, jakiś pomysł, jak to zrobić?
majick
Myślę, że w tym celu musimy dodać nowe reguły przepisywania. Ponieważ WP domyślnie go nie obsługuje, zamiast tego obsługuje ciąg zapytania, withoutcomments=1na który odpowiada cjbj. W ogóle nie jestem dobry w przepisywaniu adresów URL: D
Sumit
1
co też nie jest dobre z przepisywaniem adresów URL, postanowiłem to odwrócić i dodać wsparcie dla withcomments=1mojej odpowiedzi.
majick
dla filtra długości fragment, nie powinien to sprawdzić get_option('rss_use_excerpt')nie !get_option('rss_use_excerpt), bo jeśli jest już fałszywe filtr długość fragment nie byłyby potrzebne, by wyświetlać już pełną zawartość. O_o
majick
Cóż, nie jestem pewien dlaczego, ale jeśli zaznaczysz tę linię core.trac.wordpress.org/browser/tags/4.5/src/wp-include/... w szablonie, nie wpłynie to ustawienie, dlatego właśnie to poprawiam co to ma robić.
Sumit
4

To może nie być idealne, ale to początek. Najpierw upewnij się, że cała zawartość znajduje się w kanale:

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

Powinieneś zobaczyć pełny kanał pod tym adresem URL

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

Następnie możesz użyć add_rewrite_ruledo przekierowania odwiedzających z / feed /. Daleko od ideału, ale być może początek pracy dla kogoś innego.

cjbj
źródło
użycie return get_the_content_feed()byłoby lepsze, ponieważ stosuje the_contentrównież filtry ... ale niestety powoduje to wyświetlenie pełnej zawartości w polu opisu kanału zamiast w polu zawartości.
majick
3

Jak wspomniano w @Sumit, musisz wyłączyć kanał komentarzy dla strony (co wydaje mi się naprawdę dziwne, ponieważ domyślnie komentarze są wyłączone na stronach?) ... z tym skończyłem (pozwalając na otrzymywanie komentarzy do strony karmić, ?withcomments=1jeśli chcesz):

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

Ale w celu wyświetlenia zawartości strony, ponieważ szablon pliku danych faktycznie sprawdza, rss_use_excerptczy wyświetlać pełny tekst czy podsumowanie (ustawione w Ustawieniach -> Czytanie strony), należy to zmienić, jeśli chcesz wyświetlić całą zawartość dla kanału strony ( dzięki czemu można ustawić główną opcję na dowolną dla postów.) W przeciwnym razie cokolwiek zrobisz, treść może skończyć się w polu opisu kanału zamiast w polu zawartości.

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

I na koniec, aby pole opisu RSS wyświetlało fragment strony, być może będziesz musiał to zrobić (co w zasadzie jest kopią „ wp_trim_excerptbez” strip_shortcodes) - cóż, i tak zrobiłem, ale może to być spowodowane dziwnym zachowaniem shortcode na stronie I testowałem:

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
źródło
Och, naprawdę przepraszam: DI oszalałem. Czytałem to withoutcommentsteraz. WIDZĘ withcomment: D LOL usuwam moje komentarze;)
Sumit
bez problemu ten na pewno nie zgiął mojego umysłu.
majick