web-dev-qa-db-ja.com

検索とページ付けのためのカスタムパーマリンク

@Chip Bennetが前回の質問で私を助けて、彼のページネーション機能全体を投稿しました。この関数は私にとっては完璧に動作しますが、ドイツ語でカスタムパーマリンクを作りたいのです。

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

私はこのように私のsearch.phpテンプレートでこの関数を使います。

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

検索バーで検索した結果のページのURLは、次のようになります。

mysite.com/?s=term

代わりにドイツ語のsuche(意味 "検索")を使用したいのですが…

mysite.com/suche/term

2番目のビット…ページネーションの2ページ目をクリックすると、URLは現在このように見えます…

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

代わりに、ドイツ語の単語をドイツ語のseite( "page"の場合)にします。たぶんこんな感じでも…

mysite.com/suche/term/seite/2

@Chipが提供していたこの関数で、どういうわけか可能ですか?これに対する有効な解決策が見つからないようです。

前もって感謝します。私は本当に助けてくれてありがとう。


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

GETパラメータフォーマットが依然として検索に使用されている主な理由は、検索フォームが通常のGETフォームであり、送信時にGETパラメータが追加されたフォームURLであることです。

しかし、カスタムURLを使用して検索をキャプチャする場合のもう1つの問題は、検索語がスラッシュなどの任意のテキストになる可能性があることです。

ご希望の検索URL形式を使用したとします。

mysite.com/suche/term

そして、引用符を使って"belegte brot"という用語を検索しました。 URLになります。

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

それはそれほどひどくきれいではありません、そして同様のエスケープは他の特殊文字のためにされる必要があります。

それにもかかわらず、あなたが探しているパーマリンク構造を達成することはまだ可能です。

ステップ1:パーマリンク構造の登録

新しいパターンを追加するためにgenerate_rewrite_rulesアクションをフックします。

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

これは書き換えルールスタックの一番上にルールを登録します。これはフォームsuche/<term>suche/<term>/seite/<term>/seite/<page>およびseite/<term>/seite/<page>/のURLを取得し、それらをクエリ変数s=<term>およびpaged=<page>に変換します。

ステップ1a:WP管理領域のSettings > Permalinksページにアクセスして、パーマリンクを再生成します。

ステップ2:検索フォームにJavaScriptを挿入すると、GETパラメータを使用してフォームを送信する代わりに、上記のフォームのURLにリダイレクトされます。

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

この例では、submitイベントがキャプチャされてキャンセルされ、代わりにURLが更新されるフォームが示されています。 注意:これはテストされていません。

ステップ3get_pagenum_linkフィルタにフックを追加して、予想されるURLを作成します。

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

これはあなたの望む振る舞いを達成するのに十分なはずです。

2
Bendoh