web-dev-qa-db-fra.com

Lien permanent personnalisé pour la recherche et la pagination

@Chip Bennet m'a aidé dans une question précédente et a posté toute sa fonction de pagination. Cette fonction fonctionne parfaitement pour moi, mais j'aimerais avoir des permaliens personnalisés en allemand.

/**
 * Paginate Archive Index Page Links
 */
function oenology_get_paginate_archive_page_links( $type = 'plain', $endsize = 1, $midsize = 1 ) {
    global $wp_query, $wp_rewrite;  
    $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;

    // Sanitize input argument values
    if ( ! in_array( $type, array( 'plain', 'list', 'array' ) ) ) $type = 'plain';
    $endsize = (int) $endsize;
    $midsize = (int) $midsize;

    // Setup argument array for paginate_links()
    $pagination = array(
        'base' => @add_query_arg('paged','%#%'),
        'format' => '',
        'total' => $wp_query->max_num_pages,
        'current' => $current,
        'show_all' => false,
        'end_size' => $endsize,
        'mid_size' => $midsize,
        'type' => $type,
        'prev_text' => '<<',
        'next_text' => '>>'
    );

    if( $wp_rewrite->using_permalinks() )
        $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );

    if( !empty($wp_query->query_vars['s']) )
        $pagination['add_args'] = array( 's' => get_query_var( 's' ) );

    return paginate_links( $pagination );
}

J'utilise cette fonction dans mon modèle search.php comme ceci.

<div class="pagination">
    <?php echo oenology_get_paginate_archive_page_links(); ?>
</div>

Si je recherche dans ma barre de recherche l'URL de la page résultante ressemble à ceci

mysite.com/?s=term

J'aimerais avoir l'allemand suche (signifie "recherche") à la place ...

mysite.com/suche/term

Et le second bit… en cliquant sur la page 2 de la pagination, l’url ressemble actuellement à ceci…

mysite.com/page/2/?s=term

Je voudrais plutôt avoir le mot allemand le mot allemand seite (pour "page"). Peut-être même comme ça…

mysite.com/suche/term/seite/2

Est-ce que cela est possible avec cette fonction fournie par @Chip? Je n'arrive pas à trouver une solution de travail pour cela.

Merci d'avance. J'apprécierais vraiment de l'aide.


UPDATE

function oenology_get_paginate_archive_page_links( $type = 'plain', $endsize = 1, $midsize = 1 ) {
    global $wp_query, $wp_rewrite;  
    $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;

    // Sanitize input argument values
    if ( ! in_array( $type, array( 'plain', 'list', 'array' ) ) ) $type = 'plain';
    $endsize = (int) $endsize;
    $midsize = (int) $midsize;

    // Setup argument array for paginate_links()
    $pagination = array(
        'base' => @add_query_arg('paged','%#%'),
        'format' => '?paged=%#%',
        'total' => $wp_query->max_num_pages,
        'current' => $current,
        'show_all' => false,
        'end_size' => $endsize,
        'mid_size' => $midsize,
        'type' => $type,
        'prev_next'    => false
    );

    if ( $wp_rewrite->using_permalinks() )
        $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'seite/%#%/', 'paged' );

    /*if ( !empty($wp_query->query_vars['s']) )
            $pagination['add_args'] = array( 's' => get_query_var( 's' ) );*/

    return paginate_links( $pagination );
}

/**
 * Change search- & paginationbase
 */

add_action( 'generate_rewrite_rules', 'wr_generate_rewrite_rules' );

function wr_generate_rewrite_rules( $rewrite ) {
    $rewrite->rules = array_merge( array(
         'suche/([^/]+)(?:/seite/(\d+))?/?' => 'index.php?s='.$rewrite->preg_index(1).'&paged='.$rewrite->preg_index(2)
    ), $rewrite->rules );
}

add_filter( 'get_pagenum_link', 'wr_search_pagenum_link' );

function wr_search_pagenum_link( $link ) { 
    if ( !is_search() )
        return $link;

    // Attempt to parse the page number from the provided URL
    if ( !preg_match( '#/page/(\d+)#', $link, $matches ) )
        return $link;

    // Return a re-formed URL
    return home_url( '/suche/' . urlencode( get_query_var( 's' ) ) . '/seite/' . $matches[0] );
}
1
mathiregister

Je crois que la raison principale pour laquelle le format de paramètre GET est toujours utilisé pour les recherches est que les formulaires de recherche sont des formulaires GET standard qui, une fois soumis, sont des URL de formulaire avec les paramètres GET ajoutés.

Mais un autre problème lié à l'utilisation d'URL personnalisées pour capturer des recherches est que les termes de recherche peuvent être du texte arbitraire, y compris des barres obliques, etc., qui peuvent paraître laids lors de l'intégration d'une URL.

Supposons que nous utilisions le format de votre URL de recherche souhaitée:

mysite.com/suche/term

Et j'ai cherché le terme "belegte brot", avec les guillemets. Nous nous retrouvons avec l'URL:

mysite.com/suche/%22belegte+brot%22

Ce qui n'est pas très joli, et une évasion similaire doit être faite pour tous les autres caractères spéciaux.

Néanmoins, il est toujours possible d’obtenir la structure de permalien que vous recherchez.

Étape 1 : enregistrez une structure à permalien

Hook on generate_rewrite_rules action, pour ajouter de nouveaux modèles:

function my_generate_rewrite_rules( $rewrite ) {
    $rewrite->rules = array_merge( array(
        'suche/([^/]+)(?:/seite/(\d+))?/?' => 'index.php?s='.$rewrite->preg_index(1).'&paged='.$rewrite->preg_index(2)
    ), $rewrite->rules );
}
add_action( 'generate_rewrite_rules', 'my_generate_rewrite_rules' );

Cela enregistre une règle tout en haut de la pile de règles de réécriture, qui capturera les URL des formulaires suche/<term>, suche/<term>/, seite/<term>/seite/<page> et seite/<term>/seite/<page>/ et les transformera en variables de requête s=<term> et paged=<page>.

Étape 1a : Régénérez les liens permanents en visitant la page Settings > Permalinks dans la zone WP admin.

Étape 2 : insérez dans votre formulaire de recherche du code JavaScript qui, au lieu de soumettre un formulaire à l'aide de paramètres GET, sera redirigé vers une URL du formulaire ci-dessus:

<form id="search" action="<?php echo home_url( '/suche/' ); ?>">
    <input name="s" />
</form>
<script>
    jQuery('#search').submit(function(ev) {
        ev.preventDefault();
        location.href = jQuery(this).attr('action') + escape( jQuery('#search').find('[name="s"]').val() );
    });
</script>

Cet exemple montre un formulaire dont l'événement submit est capturé et annulé, mais met à jour l'URL. NB: Ceci n'est pas testé.

Étape 3 : Ajoutez un point d'ancrage sur le filtre get_pagenum_link pour former les URL attendues:

function my_search_pagenum_link( $link ) { 
    if( !is_search() )
        return $link;    // Do nothing unless on a search

    // Attempt to parse the page number from the provided URL
    if( !preg_match( '#/page/(\d+)#', $link, $matches ) )
        return $link;

    // Return a re-formed URL
    return home_url( '/suche/' . urlencode( get_query_var( 's' ) ) . '/seite/' . $matches[0] );
}
add_filter( 'get_pagenum_link', 'my_search_pagenum_link' );

Cela devrait être suffisant pour obtenir le comportement souhaité.

2
Bendoh