it-swarm.com.de

Umschreiben der Such- und Paginierungsbasis

Nachdem ich nun wochenlang versucht hatte, eine funktionierende Lösung zu finden, habe ich die meisten meiner Funktionen und Tests entfernt und die Paginierungsfunktion einfach in meiner functions.phh-Datei hinterlassen:

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

Mein Suchformular sieht so aus:

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

Was ich tun möchte: Ich möchte den Standard /?s= in das deutsche Wort /suche umschreiben

Wenn ich also nach "test" suche, soll meine URL so aussehen: www.mydomain.com/suche/test (anstelle von /?s=test)

Außerdem möchte ich auch die Paginierung umschreiben ... Wenn ich also nach "test" suche und auf page 2 klicke, möchte ich, dass die Adresse so aussieht ...

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

Also im Wesentlichen möchte ich /?s= in das deutsche Wort suche umschreiben (für die Suche) und &paged=2 in das deutsche Wort seite umschreiben (für die Seite)

Wie Sie sehen können, ist alles, was ich im Moment in meinem Code habe, die obige Paginierungsfunktion, da ich alle anderen Versuche entfernt habe - ich konnte es scheinbar nicht zum Laufen bringen.

Irgendwelche klugen Ideen dazu? Ich verwende die neueste WordPress-Version und würde gerne eine filterbasierte Lösung finden. Ich möchte nicht, dass JS mit dem Suchformular interagiert.

Danke im Voraus

3
mathiregister

es gibt 3 Schritte, um Ihr Ziel zu erreichen.

1 - Regeln umschreiben - WordPress muss wissen, wonach gesucht und worauf es abgebildet werden soll

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

Das obige Beispiel fügt dem Array mit den Überschreibungsregeln direkte Überschreibungsregeln hinzu, sodass jedes Mal, wenn jemand eine URL wie /suche/apfel/ aufruft, diese intern als index.php?s=apfel übersetzt wird.

2 - Suchanfragen auf unsere neue Struktur umleiten

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

Fügen Sie dies in Ihren functions.php ein. Sobald eine Suchanfrage erkannt wird, wird WordPress auf die Nice-Such-URL umgeleitet und der Browser merkt sich die Umleitung aufgrund des 301-Status, den wir an wp_redirect() weiterleiten.

Wir erstellen hier unsere Ersatz-URL für eine Suche. Wenn der Parameter $paged vorhanden ist, fügen wir diesen ebenfalls hinzu.

3 - Paginierungslinks erstellen

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

Das einzige, was Sie in dieser Funktion vermisst haben, war die Verwendung der geänderten Argumente format und base, um die Nice-URL-Basis der aktuellen Suche und das Nice-URL-Seitenargument zu erstellen.

Das sollte tun, was Sie brauchen. Sie können tiefer graben und mehr URLs neu zuordnen, um Übersetzungen mithilfe anderer Filter zu verwenden. Es gibt jedoch einige, dies ist also ein guter Ausgangspunkt!

2
sanchothefat