web-dev-qa-db-fra.com

URL de flux personnalisées

Je crée un flux personnalisé pour l'un de mes types de publication et laisse les utilisateurs définir le nom de ce flux.

http://www.mysite.com/feed/userdefinedname

Maintenant, j'aimerais aussi permettre aux utilisateurs d'afficher non seulement toutes les publications de ce CPT, mais aussi de les filtrer par catégorie. Pour le moment ça marche comme ça:

http://www.mysite.com/feed/testcategory

Cependant, je le préférerais beaucoup si je pouvais le structurer comme suit:

http://www.mysite.com/feed/userdefinedname/testcategory

Est-ce possible?

Voici le code qui génère ces flux basés sur des catégories:

 /**
 * Generate the feeds for categories
 *
 * @since 1.0
 */
function rss_c_add_category_feed( $in ) {

    $category = $GLOBALS['wp_rewrite']->feeds[ count( $GLOBALS['wp_rewrite']->feeds ) - 1 ];

    // Prepare the post query
    // Get published rss_feed posts with a rss_category slug in the taxonomy
    $rss_custom_feed_query = apply_filters(            
        'rss_custom_feed_query',
        array(
            'post_type'   => 'rss_feed', 
            'post_status' => 'publish',
            'cache_results' => false,   // disable caching
            'tax_query' => array(
                array(
                    'taxonomy' => 'rss_category',
                    'field'    => 'slug',
                    'terms'    => array( $category ),
                    'operator' => 'IN'
                )
            )
        )
    );

    // Submit the query to get latest feed items
    query_posts( $rss_custom_feed_query );

    $sources = array();
    while ( have_posts() ) {
        the_post();
        $sources[] = get_the_ID();
    }


    // Create the query array
    $pre_query = array(
        'post_type'      => 'rss_feed_item', 
        'post_status'    => 'publish',
        'cache_results'  => false,   // disable caching
        'meta_query'     => array(
                                array(
                                    'key'     => 'rss_feed_id',
                                    'value'   => $sources,
                                    'compare' => 'IN'
                                )
        )
    );

    // Get options
    $options = get_option( 'rss_settings_general' );
    if ( $options !== FALSE ) {
        // If options exist, get the limit
        $limit = $options['custom_feed_limit'];
        if ( $limit !== FALSE ) {
            // if limit exists, set the query limit
            $pre_query['posts_per_page'] = $limit;
        }
    }

    // query the posts
    query_posts( $pre_query );

    // Send content header and start ATOM output
    header('Content-Type: application/atom+xml');
    // Disabling caching
    header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
    header('Pragma: no-cache'); // HTTP 1.0.
    header('Expires: 0'); // Proxies.
    echo '<?xml version="1.0" encoding="' . get_option('blog_charset') . '"?' . '>';
    ?>
    <feed xmlns="http://www.w3.org/2005/Atom">
        <title type="text">Latest imported feed items on <?php bloginfo_rss('name'); ?></title>
        <?php
        // Start the Loop
        while ( have_posts() ) : the_post();

        ?>
        <entry>
            <title><![CDATA[<?php the_title_rss(); ?>]]></title>
            <link href="<?php the_permalink_rss(); ?>" />
            <published><?php echo get_post_time( 'Y-m-d\TH:i:s\Z' ); ?></published>
            <content type="html"><![CDATA[<?php the_content(); ?>]]></content>
        </entry>
        <?php
        // End of the Loop
        endwhile;
        ?>
    </feed>
    <?php
}
1
urok93

Comme le dit Krzysiek, il est difficile de donner une bonne réponse sans savoir comment vous alimentez vos aliments. Mais en supposant que vous ayez étendu les flux wordpress par défaut afin que votre flux soit accessible en accédant à index.php? Feed = userdefinedname, cette règle de réécriture devrait alors vous permettre de faire le travail à votre place.

add_rewrite_rule(
    '^feed/(.+)/(.+)?/?$',
    'index.php?feed=$matches[1]&category_name=$matches[2]',
    'top'
); // /feed/userdefinedname/testcategory
0
Mark Davidson