2016-12-23 4 views
0

Ich verwende Wordpress Theme namens Dreamland, die einige benutzerdefinierte Post-Typen und Taxonomien define hat. Ich möchte die Permalink-Struktur für das Weglassen von Slug in URL ändern. Fast jede gefundene Lösung basiert auf dem Parameter rewrite der Funktion register_post_type(). Ich versuchte, es direkt an Ort und Stelle zu ändern, in dem die benutzerdefinierte Posttyp registriert ist oder durch register_post_type_args Filter wie folgt aus:Rewrite URL für benutzerdefinierte Beitragstyp

function custom_post_type_args($args, $post_type) { 
    if ($post_type == "bunch_property") { 
     $args['rewrite'] = array(
      'slug' => '' 
     ); 
    } 

    return $args; 
} 
add_filter('register_post_type_args', 'custom_post_type_args', 999, 2); 

Es wurde immer mit Fehler 404 beendet. Die wichtige Information ist, dass nur erlaubter Slug "Eigenschaft" ist, obwohl ein echter Slug dieses Post-Typs "bunch_property" ist. Ich hatte das gleiche Problem mit seiner Taxonomie namens "property_category", aber ich löste es durch this solution. Gibt es auch etwas Ähnliches für Post-Typ anstelle von Taxonomie? Oder eine andere Lösung außer der Rewrite-Regel für .htaccess?

+0

Dies funktioniert gut, wenn Permalink-Struktur ist% Postname%, aber ich möchte mein eigenes Permalink-Schema: /% Eigenschaft_Kategorie% /% Postname% Leider funktionieren in diesem Fall nicht. –

Antwort

1

versuchen diese Lösung Remove Custom Post Type Slug from Permalinks

Funktion gp_remove_cpt_slug ($ post_link, $ post, $ leavename) {

if ('bunch_property' != $post->post_type || 'publish' != $post->post_status) { 
     return $post_link; 
    } 

    $post_link = str_replace('/' . $post->post_type . '/', '/', $post_link); 

    return $post_link; 
} 
add_filter('post_type_link', 'gp_remove_cpt_slug', 10, 3); 


function gp_parse_request_trick($query) { 

// Only noop the main query 
if (! $query->is_main_query()) 
    return; 

// Only noop our very specific rewrite rule match 
if (2 != count($query->query) || ! isset($query->query['page'])) { 
    return; 
} 

// 'name' will be set if post permalinks are just post_name, otherwise the page rule will match 
if (! empty($query->query['name'])) { 
    $query->set('post_type', array('post', 'page', 'bunch_property')); 
} 
} 
add_action('pre_get_posts', 'gp_parse_request_trick'); 

benutzerdefinierte Taxonomie hinzufügen die URL schreiben

add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite'); 

function taxonomy_slug_rewrite($wp_rewrite) { 
    $rules = array(); 
    // change "^property/([^/]+)/([^/]+)/?" to "^([^/]+)/([^/]+)/?" to test without "property" in url 
    $rules["^property/([^/]+)/([^/]+)/?"] = 'index.php?post_type=bunch_property&property_category=$matches[1]&resource=$matches[2]'; 
    // merge with global rules 
    $wp_rewrite->rules = $rules + $wp_rewrite->rules; 
} 
+0

@Pavel Němec Sieht Ihre URL nach/property/slug oder/bunch_property/slug aus? –

+0

Jetzt/Eigenschaft/Slug. Eigentlich funktioniert Ihre Lösung gut, wenn Permalink-Struktur auf% postname% festgelegt ist, aber ich möchte auch Taxonomie in Permalink enthalten: /% Eigenschaftskategorie% /% postname%. Leider wird in diesem Fall nicht gearbeitet. Das Ergebnis ist eine leere Seite auf einer einzelnen Post-Seite? –

+0

@ PavelNěmec Ich hatte dasselbe Problem in einem Projekt, und ich konnte es beheben, indem ich den Code hinzufügte, den ich der Lösung hinzugefügt habe. aber in meinem Fall habe ich die post type slug (in meinem Fall Ressourcen, für Sie Eigentum) .Ich schlage vor, es zu verlassen, sonst testen Sie ohne und Sie bekommen, was erwartet –

0

Schließlich löse ich es Danke an Sofiane Achouba. Bis auf den letzten Teil, der durch add_rewrite_rule gelöst wird. Es ist nicht optimal, weil ich Schleife verlangen für Throught alle Beiträge gehen und add_rewrite_rule() Funktion für jeden von ihnen gelten:

function my_custom_rewrite() { 
    $args = array("post_type" => "bunch_property","posts_per_page" => -1); 
    $posts = get_posts($args); 
     foreach($posts as $post){ 
     $cat = get_the_terms($post,"property_category"); 
     $cat_slug = $cat[0]->slug; 
     $post_slug = $post->post_name; 
     add_rewrite_rule('^'.$cat_slug.'/'.$post_slug.'?/','index.php/property/'.$cat_slug.'/'.$post_slug.'/', 'top'); 
     } 
} 
add_action('init', 'my_custom_rewrite'); 

Ich habe versucht, gehen throught catagories nur, aber es funktioniert nicht.

Es ist seltsam, aber das funktioniert:

add_rewrite_rule('^xxx/(.*?)/', 'index.php/property/xxx/yyy/','top'); // where xxx is post name and yyy category slug 

aber doen't:

add_rewrite_rule('^xxx/(.*?)/', 'index.php/property/xxx/$matches/','top'); 

Was mich oben zu der Lösung geführt. Nochmal wiederholen, es ist nicht optimal.

Verwandte Themen