Ek sorgu var ile arama sonuçları için oldukça kalıcı bağlantılar


10

Ben de ekstra bir sorgu var kullanarak güzel bir kalıcı bağlantı wp_redirectve template_redirectkanca içine bir arama URL'si yeniden yazmak nasıl bilmek istiyorum .

Ben değiştirmek için iyi çalışır Nice Search eklentisi kodu almış :http://example.com?s=africahttp://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();
        }

    }

Ancak , ziyaretçilerin aramayı belirli bir gönderi türüne daraltmasına izin vermek için Relevanssi eklentisi ile birlikte bir seçim açılır listesi kullanıyorum . Bu post_type, örneğin bir sorgu var http://example.com?s=africa&post_type=features. Bunun URL gibi bir şeye sahip olmasını istiyorum http://example.com/search/africa/section/features.

Güzel Arama kodu, post_type sorgu değişkeninin kaybolmasına neden olur. Bu yüzden aşağıdaki kodu denedim:

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

}

ancak WordPress artık arama teriminin olduğunu düşünüyor africa/section/features.

Ben arama terimi ve sorgu var tüm güzel bir kalıcı bağlantı tutmak bir yolu var mı?

Teşekkürler Simon

Yanıtlar:


7

Arama yeniden yazma kurallarını değiştirmek için search_rewrite_rulesfiltreye bağlanabilirsiniz . Yazı türleriyle eşleşen fazladan yeniden yazma kurallarını kendiniz ekleyebilir veya varsayılan "arama yeniden yazma yapısını" yazı türünü de içerecek şekilde değiştirebilir ve ardından kuralları yeniden oluşturabilirsiniz (dört kural vardır: biri standart, biri disk belleği olan ve iki yayın için). Çünkü WP_Rewrite::generate_rewrite_rules() her "dizin düzeyinde" kurallar oluşturur , sizin için kuralları alacak /search/[keyword]/section/[post_type]/, /search/[keyword]/section/ve /search/[keyword]/. Orta kurala ihtiyacınız yok, ama onu tutmak zarar vermez.

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

Kuralları kontrol etmek için Rewrite analyzer eklentimi kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.