2015-09-09 2 views
1

Я написал свой собственный rss-шаблон с WP_Query, но он не работает должным образом. Вот код:WordPress шаблон RSS с пользовательским wp_query

<?php 
header('Content-Type: ' . feed_content_type('rss-http') . '; charset=' . get_option('blog_charset'), true); 
$more = 1; 

echo '<?xml version="1.0" encoding="' . get_option('blog_charset') . '"?' . '>'; 

/** 
* Fires between the xml and rss tags in a feed. 
* 
* @since 4.0.0 
* 
* @param string $context Type of feed. Possible values include 'rss2', 'rss2-comments', 
*      'rdf', 'atom', and 'atom-comments'. 
*/ 
do_action('rss_tag_pre', 'rss2'); 
?> 
<rss version="2.0" 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:wfw="http://wellformedweb.org/CommentAPI/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/" 
    <?php 
    /** 
    * Fires at the end of the RSS root to add namespaces. 
    * 
    * @since 2.0.0 
    */ 
    do_action('rss2_ns'); 
    ?> 
    > 

    <channel> 
     <title><?php bloginfo_rss('name'); 
      wp_title_rss(); ?></title> 
     <atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml"/> 
     <link><?php bloginfo_rss('url') ?></link> 
     <description><?php bloginfo_rss("description") ?></description> 
     <lastBuildDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></lastBuildDate> 
     <language><?php bloginfo_rss('language'); ?></language> 
     <sy:updatePeriod><?php 
      $duration = 'hourly'; 

      /** 
      * Filter how often to update the RSS feed. 
      * 
      * @since 2.1.0 
      * 
      * @param string $duration The update period. Accepts 'hourly', 'daily', 'weekly', 'monthly', 
      *       'yearly'. Default 'hourly'. 
      */ 
      echo apply_filters('rss_update_period', $duration); 
      ?></sy:updatePeriod> 
     <sy:updateFrequency><?php 
      $frequency = '1'; 

      /** 
      * Filter the RSS update frequency. 
      * 
      * @since 2.1.0 
      * 
      * @param string $frequency An integer passed as a string representing the frequency 
      *       of RSS updates within the update period. Default '1'. 
      */ 
      echo apply_filters('rss_update_frequency', $frequency); 
      ?></sy:updateFrequency> 
     <?php 
     /** 
     * Fires at the end of the RSS2 Feed Header. 
     * 
     * @since 2.0.0 
     */ 
     do_action('rss2_head'); 

     $query_args = array(
      'post_type' => 'post', 
      'order' => 'DESC', 
      'orderby' => 'date', 
      'meta_query' => array(
       'relation' => 'OR', 
       array(
        'key' => 'votes', 
        'value' => '10', 
        'compare' => '>=', 
        'type' => 'NUMERIC', 
       ), 
       array(
        'key' => 'author_role', 
        'value' => array('administrator', 'contributor', 'editor', 'author'), 
        'compare' => 'IN', 
       ), 
      ), 
      'post_status' => 'publish' 
     ); 

     $query = new WP_Query($query_args); 

     if ($query->have_posts()) : 
      while ($query->have_posts()) : 
       $query->the_post(); 
       ?> 
       <item> 
        <title><?php the_title_rss() ?></title> 
        <link><?php the_permalink_rss() ?></link> 
        <comments><?php comments_link_feed(); ?></comments> 
        <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate> 
        <dc:creator><![CDATA[<?php the_author() ?>]]></dc:creator> 
        <?php the_category_rss('rss2') ?> 

        <guid isPermaLink="false"><?php the_guid(); ?></guid> 
        <?php if (get_option('rss_use_excerpt')) : ?> 
         <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description> 
        <?php else : ?> 
         <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description> 
         <?php $content = get_the_content_feed('rss2'); ?> 
         <?php if (strlen($content) > 0) : ?> 
          <content:encoded><![CDATA[<?php echo $content; ?>]]></content:encoded> 
         <?php else : ?> 
          <content:encoded><![CDATA[<?php the_excerpt_rss(); ?>]]></content:encoded> 
         <?php endif; ?> 
        <?php endif; ?> 
        <wfw:commentRss><?php echo esc_url(get_post_comments_feed_link(null, 'rss2')); ?></wfw:commentRss> 
        <slash:comments><?php echo get_comments_number(); ?></slash:comments> 
        <?php rss_enclosure(); ?> 
        <?php 
        /** 
        * Fires at the end of each RSS2 feed item. 
        * 
        * @since 2.0.0 
        */ 
        do_action('rss2_item'); 
        ?> 
       </item> 
      <?php endwhile; ?> 
     <?php endif; ?> 
     <?php wp_reset_postdata(); ?> 
     <?php wp_reset_query(); ?> 
    </channel> 
</rss> 

Все отлично работает, но я получаю случайное содержание для каждой записи (get_the_content_feed('rss2'); функция возвращает случайное содержание). Как я могу это исправить?

+0

Это только отрывок, который возвращает неправильное содержание, или это то же самое за титул? – vard

+0

Название одобрено, только полный контент плох. – Rokas

ответ

0

Итак, я понял, что вы не можете использовать пользовательские циклы в rss-шаблоне, вам нужно фильтровать фид в pre_get_posts.

Вы можете передать любой параметр $query объекта, например:

feed_filter($query) 
{ 
    if($query->is_feed && $query->is_main_query()) 
    { 
     $query_args = array(
       'relation' => 'OR', 
       array(
        'key' => 'votes', 
        'value' => '10', 
        'compare' => '>=', 
        'type' => 'NUMERIC', 
       ), 
       array(
        'key' => 'author_role', 
        'value' => array('administrator', 'contributor', 'editor', 'author'), 
        'compare' => 'IN', 
       ) 
     ); 

     $query->set('meta_query', $query_args); 
    } 
} 
add_action('pre_get_posts', 'feed_filter');