Permalinks cantik untuk hasil pencarian dengan var permintaan tambahan

10

Saya ingin tahu bagaimana saya bisa menulis ulang URL pencarian yang juga berisi var permintaan tambahan menjadi permalink cantik yang digunakan wp_redirectdan template_redirecthook.

Saya telah mengambil kode dari plugin Nice Search yang berfungsi dengan baik untuk berubah http://example.com?s=africamenjadi http://example.com/search/africa:

add_action( 'template_redirect', 'my_rewrite' ) );

function my_rewrite() {

        if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
            exit();
        }

    }

Tetapi saya menggunakan dropdown pilih dalam kombinasi dengan plugin Relevanssi untuk memungkinkan pengunjung mempersempit pencarian ke jenis posting tertentu. Ini menambahkan post_typekueri var, mis http://example.com?s=africa&post_type=features. Saya ingin ini memiliki URL seperti ini http://example.com/search/africa/section/features.

Kode Nice Search menyebabkan var kueri post_type hilang. Jadi saya mencoba kode berikut:

function my_rewrite() {

    if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
        if ( isset( $_GET['post_type'] ) and '' !== $_GET['post_type'] ) {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) . '/section/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 'post_type' ) ) ) );
        } else {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
        }
        exit();
    }

}

tetapi WordPress sekarang berpikir istilah pencariannya adalah africa/section/features.

Apakah ada cara saya dapat menyimpan istilah pencarian dan var semua dalam permalink bagus?

Terima kasih Simon

Simon Blackbourn
sumber

Jawaban:

7

Untuk mengubah aturan penulisan ulang pencarian, Anda dapat menghubungkan ke search_rewrite_rulesfilter. Anda dapat menambahkan sendiri aturan penulisan ulang tambahan yang cocok dengan jenis posting, atau Anda dapat mengubah "struktur penulisan ulang pencarian" default untuk juga memasukkan jenis posting dan kemudian menghasilkan kembali aturan (ada empat aturan: satu standar, satu dengan paging dan dua untuk feed). Karena WP_Rewrite::generate_rewrite_rules() menghasilkan aturan di setiap "tingkat direktori" , Anda akan mendapatkan aturan untuk /search/[keyword]/section/[post_type]/, /search/[keyword]/section/dan /search/[keyword]/. Anda tidak membutuhkan aturan tengah, tetapi tidak ada salahnya untuk tetap menggunakannya.

add_filter( 'search_rewrite_rules', 'wpse15418_search_rewrite_rules' );
function wpse15418_search_rewrite_rules( $search_rewrite_rules )
{
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag( '%post_type%', '([^/]+)', 'post_type=' );
    $search_structure = $wp_rewrite->get_search_permastruct();
    return $wp_rewrite->generate_rewrite_rules( $search_structure . '/section/%post_type%', EP_SEARCH );
}

Untuk memeriksa aturan, gunakan plugin penganalisis Rewrite saya .

Jan Fabry
sumber