web-dev-qa-db-fra.com

Base de réécriture de recherche et de pagination

Après avoir essayé pendant des semaines maintenant de trouver une solution de travail, je me suis débarrassé de la plupart de mes fonctions et de mes essais et je viens de laisser la fonction de pagination en dessous dans mon fichier functions.phh:

/**
 * Pagination links for search and archives
 */

function get_pagination_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','%#%'),
        'total'         => $wp_query->max_num_pages,
        'current'       => $current,
        'show_all'      => false,
        'end_size'      => $endsize,
        'mid_size'      => $midsize,
        'type'          => $type,
        'prev_next'     => false,
        'paged'         => get_query_var( 'paged' )
    );

    return paginate_links( $pagination );
}

Mon formulaire de recherche ressemble à ceci:

<form class="search-form" action="<?php echo home_url( '/' ); ?>" method="get">
    <fieldset>
        <div class="input-inside-label">
            <label for="s">Suchen …</label>
            <input type="text" name="s" class="s" value="<?php the_search_query(); ?>" />
        </div>
        <button type="submit" class="search-button">Suchen</button>
    </fieldset>
</form>

Ce que je veux faire: Je voudrais réécrire le /?s= standard en Word allemand /suche

Donc, lors de la recherche de "test", je veux que mon URL ressemble à ceci: www.mydomain.com/suche/test (au lieu de /?s=test)

De plus, j'aimerais également réécrire la pagination… Donc, lorsque vous recherchez "test" et cliquez sur page 2, j'aimerais que l'adresse ressemble à ceci…

www.mydomain.com/suche/test/seite/2

Donc, fondamentalement, j'aimerais réécrire /?s= dans le mot allemand suche (pour la recherche) et réécrire &paged=2 dans le mot allemand seite (pour la page)

Comme vous pouvez le constater, tout ce que j’ai dans mon code à l’heure actuelle est la fonction de pagination ci-dessus, car j’ai supprimé tous les autres essais - j’ai semblé ne pas pouvoir le faire fonctionner.

Des idées intelligentes à ce sujet? J'utilise la dernière version de wordpress et j'aimerais trouver une solution basée sur les filtres. Je ne veux pas que JS interagisse avec le formulaire de recherche.

Merci d'avance

3
mathiregister

il y a 3 étapes pour atteindre votre objectif.

1 - Réécrire les règles - wordpress a besoin de savoir quoi chercher et à quoi le mapper

add_rewrite_rule( 'suche/([^/]+)/?$', 'index.php?s=$matches[1]', 'top' );
add_rewrite_rule( 'suche/([^/]+)(/seite/(\d+))/?$', 'index.php?s=$matches[1]&paged=$matches[3]', 'top' );

Ce qui précède ajoute des règles de réécriture directes au tableau de règles de réécriture afin que chaque fois que quelqu'un accède à une URL telle que /suche/apfel/, celle-ci est traduite en interne sous la forme index.php?s=apfel.

2 - Rediriger les recherches vers notre nouvelle structure

// redirect immediately
if ( isset( $_GET[ 's' ] ) ) {
    $location = '/suche/' . $_GET[ 's' ];
    if ( isset( $_GET[ 'paged' ] ) && $_GET[ 'paged' ] )
        $location .= '/seite/' . $_GET[ 'paged' ];
    wp_redirect( trailingslashit( home_url( $location ) ), 301 );
    exit;
}

Placez ceci dans votre functions.php. Dès qu'une requête de recherche est détectée, wordpress sera redirigé vers l'URL de recherche Nice et le navigateur se souviendra de la redirection en raison du statut 301 que nous passons à wp_redirect().

Nous construisons notre URL de remplacement pour une recherche ici, et si le paramètre $paged est présent, nous l'ajoutons également.

3 - Créer des liens de pagination

function pagination_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'          => home_url( '/suche/' . get_search_query() . '%_%' ),
        'format'        => '/seite/%#%/', // ?page=%#% : %#% is replaced by the page number
        'total'         => $wp_query->max_num_pages,
        'current'       => $current,
        'show_all'      => false,
        'end_size'      => $endsize,
        'mid_size'      => $midsize,
        'type'          => $type,
        'prev_next'     => false
    );

    return paginate_links( $pagination );
}

La seule chose qui vous manquait dans cette fonction utilisait les arguments modifiés format et base pour créer la base d'URL Nice de la recherche actuelle et l'argument de page URL Nice.

Cela devrait faire ce dont vous avez besoin. Vous pouvez creuser plus profondément et remapper plus d'URL pour utiliser des traductions en utilisant d'autres filtres, mais il y en a plusieurs, donc c'est un bon point de départ!

2
sanchothefat