web-dev-qa-db-fra.com

Jolies urls pour la pagination personnalisée

J'ai une requête personnalisée avec une pagination personnalisée avec laquelle j'aimerais utiliser de jolies URL, comme la pagination standard, plutôt que d'ajouter une chaîne de requête à l'URL, c'est-à-dire

www.example.com/posttype/nom_page/cpage/2

au lieu de

www.example.com/posttype/pagename/?cpage=2

Créer de jolies urls était assez facile en utilisant le paramètre format de paginate_links ()

$args = array(
    'format'    => 'cpage/%#%',
    'current'   => $cpage,
    'total'     => $custom_query->max_num_pages,
    'type'      => 'array',
    'prev_text' => __('Previous'),
    'next_text' => __('Next'),
);
$paging = paginate_links( $args );

Le problème que je rencontre est la nécessité de réécrire ces URL dans une chaîne de requête lorsque la page est visitée, car WP ne reconnaît pas ma variable 'cpage' dans une jolie URL.

Donc, je réécris les urls dans .htaccess comme ceci

RewriteRule ^/posttype/([^/]*)/cpage/([0-9]*) /posttype/$1/?cpage=$2 [QSA]

et j'ai vérifié cette règle devrait réécrire la manière que je prévois en utilisant http://martinmelin.se/rewrite-rule-tester/ . Lorsque j'applique la règle au .htaccess sur mon site, je reçois un 404 lors de la visite de liens de pagination et je ne comprends pas pourquoi. La pagination fonctionne très bien si je n'utilise pas de jolies URL.

J'ai utilisé mod_rewrite plusieurs fois dans le passé, mais jamais avec WP. Y a-t-il des pièges dont je devrais être conscient que cela pourrait affecter ce que j'essaie de faire, ou y a-t-il un meilleur moyen d'y parvenir?

Enregistrement du type de message avec Plugin Types d'outils :  Post type registration using Toolset Types plugin 

get_post_type_object

WP_Post_Type Object
(
    [name] => deal
    [label] => Deals
    [labels] => stdClass Object
        (
            [name] => Deals
            [singular_name] => Deal
            [add_new] => Add New
            [add_new_item] => Add New Deal
            [edit_item] => Edit Deal
            [new_item] => New Deal
            [view_item] => View Deal
            [search_items] => Search Deals
            [not_found] => No Deals found
            [not_found_in_trash] => No Deals found in Trash
            [parent_item_colon] => Parent text
            [all_items] => All items
            [archives] => All items
            [insert_into_item] => Insert into post
            [uploaded_to_this_item] => Uploaded to this post
            [featured_image] => Featured Image
            [set_featured_image] => Set featured image
            [remove_featured_image] => Remove featured image
            [use_featured_image] => Use as featured image
            [filter_items_list] => Filter posts list
            [items_list_navigation] => Posts list navigation
            [items_list] => Posts list
            [menu_name] => Deals
            [enter_title_here] => Enter title here
            [name_admin_bar] => Deal
        )

    [description] => The link between compare and operator
    [hierarchical] => 
    [exclude_from_search] => 1
    [publicly_queryable] => 1
    [show_ui] => 1
    [show_in_menu] => 1
    [show_in_nav_menus] => 1
    [show_in_admin_bar] => 1
    [menu_position] => 
    [menu_icon] => dashicons-admin-post
    [capability_type] => post
    [map_meta_cap] => 1
    [register_meta_box_cb] => 
    [taxonomies] => Array
        (
        )

    [has_archive] => 
    [query_var] => deal
    [can_export] => 1
    [delete_with_user] => 
    [_builtin] => 
    [_edit_link] => post.php?post=%d
    [cap] => stdClass Object
        (
            [edit_post] => edit_post
            [read_post] => read_post
            [delete_post] => delete_post
            [edit_posts] => edit_posts
            [edit_others_posts] => edit_others_posts
            [publish_posts] => publish_posts
            [read_private_posts] => read_private_posts
            [read] => read
            [delete_posts] => delete_posts
            [delete_private_posts] => delete_private_posts
            [delete_published_posts] => delete_published_posts
            [delete_others_posts] => delete_others_posts
            [edit_private_posts] => edit_private_posts
            [edit_published_posts] => edit_published_posts
            [create_posts] => edit_posts
        )

    [rewrite] => Array
        (
            [enabled] => 1
            [with_front] => 1
            [pages] => 1
            [feeds] => 
            [slug] => deal
            [ep_mask] => 1
        )

    [_toolset_edit_last] => 1482798189
    [_wpcf_author_id] => 1
    [wpcf-post-type] => deal
    [icon] => admin-post
    [slug] => deal
    [dashboard_glance] => 1
    [custom-field-group] => Array
        (
            [5] => 1
        )

    [has_archive_slug] => 
    [show_in_menu_page] => 
    [query_var_enabled] => 1
    [permalink_epmask] => 1
    [rest_base] => deal
    [post_relationship] => Array
        (
            [belongs] => Array
                (
                    [compare] => 1
                    [operator] => 1
                )

        )

    [show_in_rest] => 
)

sortie du plug-in de l'analyseur de réécriture  enter image description here 

1
gpcola

Vous pouvez gérer cela avec le système de réécriture interne de WordPress en en ajoutant un noeud final de réécriture :

function wpd_cpage_endpoint() {
    add_rewrite_endpoint( 'cpage', EP_PERMALINK );
}
add_action( 'init', 'wpd_cpage_endpoint' );

Cela ajoutera des règles de réécriture supplémentaires activant /cpage/n/ à la fin des permaliens.

Vous pouvez ensuite extraire la valeur de ces demandes avec get_query_var( 'cpage' ).

MODIFIER-

C'est le code que j'ai utilisé pour enregistrer le type de message et le point final:

function wpd_test_post_type() {

    $args = array(
        'label' => 'Test Type',
        'public' => true,
        'rewrite' => true,
        'supports' => array( 'title' ),
    );

    register_post_type(
        'test_type',
        $args
    );

    add_rewrite_endpoint( 'cpage', EP_PERMALINK );

}
add_action( 'init','wpd_test_post_type' );
0
Milo