it-swarm.com.de

Benutzerdefinierter Permalink für Suche und Paginierung

@Chip Bennet hat mir in einer früheren Frage geholfen und seine gesamte Paginierungsfunktion gepostet. Diese Funktion funktioniert einwandfrei für mich, aber ich hätte gerne benutzerdefinierte Permalinks in Deutsch.

/**
 * 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 );
}

Ich benutze diese Funktion in meiner search.php-Vorlage wie folgt.

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

Wenn ich in meiner Suchleiste suche, sieht die URL für die resultierende Seite so aus

mysite.com/?s=term

Ich möchte stattdessen die deutsche suche haben (bedeutet "Suche") ...

mysite.com/suche/term

Und das zweite bisschen ... wenn Sie auf die Seite 2 der Paginierung klicken, sieht die URL momentan so aus ...

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

Ich möchte stattdessen das deutsche Wort das deutsche Wort seite (für "page") haben. Vielleicht sogar so ...

mysite.com/suche/term/seite/2

Ist das mit dieser von @Chip bereitgestellten Funktion irgendwie möglich? Ich kann keine funktionierende Lösung dafür finden.

Danke im Voraus. Ich würde mich sehr über Hilfe freuen.


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

Ich glaube, der Hauptgrund dafür, dass das GET-Parameterformat weiterhin für Suchvorgänge verwendet wird, ist, dass es sich bei Suchformularen um reguläre GET-Formulare handelt, die bei der Übermittlung von Formular-URLs mit den angehängten GET-Parametern verwendet werden.

Ein weiteres Problem bei der Verwendung benutzerdefinierter URLs zum Erfassen von Suchvorgängen besteht darin, dass es sich bei Suchbegriffen um beliebigen Text handeln kann, einschließlich Schrägstrichen usw., die beim Einbinden in eine URL hässlich aussehen können.

Angenommen, wir haben Ihr gewünschtes Such-URL-Format verwendet:

mysite.com/suche/term

Und ich suchte nach dem Begriff "belegte brot" mit den Anführungszeichen. Wir landen mit der URL:

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

Das ist nicht besonders hübsch, und für alle anderen Sonderzeichen muss eine ähnliche Flucht durchgeführt werden.

Trotzdem ist es immer noch möglich, die von Ihnen gesuchte Permalink-Struktur zu erreichen.

Schritt 1 : Registrieren Sie die Permalink-Struktur

Haken Sie an generate_rewrite_rules Aktion, um neue Muster hinzuzufügen:

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' );

Hiermit wird eine Regel ganz oben im Rewrite-Regelstapel registriert, mit der URLs der Formulare suche/<term>, suche/<term>/, seite/<term>/seite/<page> und seite/<term>/seite/<page>/ erfasst und in die Abfragevariablen s=<term> und paged=<page> umgewandelt werden.

Schritt 1a : Generieren Sie Permalinks neu, indem Sie die Seite Settings > Permalinks im Administrationsbereich WP besuchen.

Schritt 2 : Fügen Sie JavaScript in Ihr Suchformular ein, das statt eines Formulars mit GET-Parametern zu einer URL des obigen Formulars umleitet:

<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>

Dieses Beispiel zeigt ein Formular, dessen submit -Ereignis erfasst und abgebrochen wird, anstatt die URL zu aktualisieren. Hinweis: Dies ist nicht getestet.

Schritt 3 : Fügen Sie dem get_pagenum_link-Filter einen Haken hinzu, um die erwarteten URLs zu bilden:

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' );

Dies sollte ausreichen, um Ihr gewünschtes Verhalten zu erreichen.

2
Bendoh