web-dev-qa-db-ja.com

検索とページ区切りの書き換え

何週間も試してみた結果、実用的な解決策を見つけることができたので、私はほとんどの関数と試行を取り除き、ちょうど私の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 );
}

私の検索フォームは以下のようになります。

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

やりたいこと:標準の/?s=をドイツ語の/sucheに書き換えたいのですが

それで、 "test"を検索するとき、私のURLを(www.mydomain.com/suche/testの代わりに)/?s=testのように見せたいです。

さらに、ページネーションも書き換えたいのですが… "test"を検索してpage 2をクリックするときは、アドレスをこのようにします。

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

だから本質的に私は/?s=をドイツ語のsuche(検索用)に書き換えそして&paged=2をドイツ語のseite(ページ用)に書き換えたい

お分かりのように、私が今自分のコードに持っているのは、他のすべての試行を削除したため、上記のページ付け関数だけです。それをうまく機能させることはできませんでした。

それについて巧妙なアイデアはありますか?私は最新のワードプレスバージョンを使用していて、フィルタベースの解決策を見つけたいと思います。私はどのJSも検索フォームと対話したくありません。

前もって感謝します

3
mathiregister

目標を達成するための3つのステップがあります。

1 - 書き換え規則 - wordpressは何を探すべきか、そして何をそれにマッピングするかを知る必要がある

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

上記は、書き換え規則の配列に直接書き換え規則を追加しているので、誰かが/suche/apfel/のようなURLにアクセスしたときはいつでも、それは内部的にindex.php?s=apfelとして翻訳されます。

2 - 検索を新しい構造にリダイレクトします

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

これをあなたのfunctions.phpに入れてください。検索要求が検出されるとすぐにwordpressはNice検索URLにリダイレクトし、ブラウザは301ステータスがwp_redirect()に渡されるためリダイレクトを記憶します。

ここで検索用の代替URLを作成しています。$pagedパラメータが存在する場合は、それも追加します。

3 - ページネーションリンクを作成する

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

この関数に欠けていた唯一のことは、現在の検索のNice URLベースとNice URL page引数を作成するために変更されたformatbase引数を使用することでした。

それはあなたが必要とすることをするべきです。他のフィルタを使ってもっと多くのURLを掘り下げて翻訳を使うことができますが、かなりの数があるので、これは良い出発点です!

2
sanchothefat