Regionalisierter Inhalt

Ok, also – Ich arbeite an einer Magazin-Website, die “regionalisierte” Inhalte benötigt.

So habe ich zum Beispiel:

  • Großbritannien (enthält alle)
  • Manchester
  • Brighton
  • London

Ich habe diese functionalität bereits erfolgreich implementiert, indem ich eine benutzerdefinierte Taxonomie für bestimmte Inhalte (hauptsächlich Posts) einfüge.

Ich pre_get_posts dann alle Abfragen mit einem pre_get_posts Filter, um Ihnen eine Idee zu geben, die so aussieht:

 protected function regionalize() { add_filter( 'pre_get_posts', array( $this, 'pre_posts' ) ); } function pre_posts( $query ) { if ( $query->is_main_query() && ! is_admin() || ( is_archive() || is_search() || is_front_page() || is_home() || is_tax() ) ) { if(in_array ( $query->get('post_type'), $this->ENABLED_POST_TYPES )) { $query->set( 'tax_query', array( $this->getRegionTaxQuery() ) ); } } return $query; } 

Nun, wie ich noch einmal sage, alles funktioniert perfekt wie erwartet. Was ich jetzt tun muss, ist einige benutzerdefinierte Rewrite-Regeln zu erstellen – ich habe nicht viel Erfahrung damit, deshalb suche ich Hilfe von außen 🙂

Ich muss in der Lage sein, ALLE URLs, die von der Regionalisierung abgedeckt werden, voranzuzählen.

Also zum Beispiel:

  • www.meinewebsite.com/london/post-name
  • www.meinewebsite.com/manchester/post-name

etc…

Ich benutze WP SEO von Yoast, also würde ich immer noch gerne die kanonische URL setzen und zugänglich machen.

Regionalisierung gilt nicht für Seiten, nur “Posts” & “Events”.

Ich hatte ein bisschen Glück und bekam 1/4 davon:

 public function rewrite() { global $wp_rewrite; $wp_rewrite->page_structure = $wp_rewrite->root .sanitize_title($this->getCurrentRegion()).'/%pagename%'; $wp_rewrite->flush_rules(); } 

Irgendwelche Ideen? Hoffe das ist klar genug!

AKTUALISIEREN:

Ich habe 90% erreicht, wonach ich gefragt habe, indem ich Folgendes mache:

“Zurücksetzen” der Post-Typen, für die ich die Regionalisierung verwenden möchte:

 public function rewrite_resets() { global $wp_rewrite; foreach($this->ENABLED_POST_TYPES as $post_type) { $args = get_post_type_object($post_type); switch($post_type) { case 'post': $slug = '/%region%/%postname%'; break; case 'event': $slug = '/%region%/events'; break; } $args->rewrite["slug"] = $slug; $args->rewrite["with_front"] = 0; register_post_type($args->name, $args); } // Fixes pages but breaks posts :( add_rewrite_rule('^([^/]*)?', 'index.php?pagename=$matches[1]', 'bottom'); } 

Dies ist mit init

Ich kontrolliere dann die Permalinks & Templates mit diesen functionen:

 public function post_permalink_structure($post_link, $id = 0, $leavename = FALSE) { if ( strpos('%region%', $post_link) === 'FALSE' ) { return $post_link; } $post = get_post($id); if ( !is_object($post) || !in_array($post->post_type, $this->ENABLED_POST_TYPES )) { return $post_link; } $terms = wp_get_object_terms($post->ID, 'region'); if(!$terms) $terms[0]->slug = sanitize_title(self::DEFAULT_REGION); return str_replace('%region%', $terms[0]->slug, $post_link); } public function intercept_template() { global $wp_query, $post; if( array_key_exists( 'region', $wp_query->query_vars ) ) { if( !has_term(get_query_var('region'), 'region', $post->ID) && is_single() && in_array($post->post_type, $this->ENABLED_POST_TYPES) ) { $wp_query->set_404(); status_header( 404 ); nocache_headers(); include TEMPLATEPATH . "/404.php"; exit; } } } 

Jetzt gibt es ein anderes Problem (und möglicherweise einige andere versteckte Probleme mit anderen Umschreibungen, die mir derzeit nicht bekannt sind!)

Beim Versuch, Seiten anzuzeigen, erhalte ich jetzt einen 404-Fehler, da dieser beim erneuten Zurücksetzen der Beitragstypen in Konflikt mit den oben angegebenen neuen Regeln steht.

Ich weiß das, weil ich der 404-Vorlage, die dies für die “Über uns” -Seite angezeigt hat, etwas Code hinzugefügt habe:

 Request: about Matched Rewrite Rule: ([^/]+)/?$ Matched Rewrite Query: region=about Loaded Template: 404.php 

Es ist ziemlich klar, was hier passiert, es erkennt die region im Gegensatz zum pagename .

Ich habe keine Ahnung, wie ich das lösen soll 🙁

Solutions Collecting From Web of "Regionalisierter Inhalt"

Ich denke, Sie können eine Rewrite-Regel für jede “Region” erstellen, um andere wichtige Regeln, die Sie benötigen könnten (wie Seiten, Kategorien usw.), nicht zu überschreiben. Ich habe mit Ihren Codebeispielen gespielt und könnte mit einer kleinen Änderung in rewrite_resets arbeiten:

 public function rewrite_resets() { global $wp_rewrite; foreach($this->ENABLED_POST_TYPES as $post_type) { $args = get_post_type_object($post_type); switch($post_type) { case 'post': $slug = '/%region%/%postname%'; break; case 'event': $slug = '/%region%/events'; break; } $args->rewrite["slug"] = $slug; $args->rewrite["with_front"] = 0; register_post_type($args->name, $args); } $categories = get_terms( 'region', array( 'orderby' => 'count', 'hide_empty' => 0, )); // Rewrite rule for each taxonomy foreach($categories as $_category) { add_rewrite_rule('^'.$_category->slug.'/([^/]+)?', 'index.php?name=$matches[1]', 'bottom'); } } 

Dies funktioniert, wenn Ihr Taxonomenname “region” lautet (ich habe mit der Taxonomie “category” den Standard gespielt, am Ende ist das selbe)

Auf diese Weise können Sie eine Taxonomie-Region mit dem Namen “London” erstellen, wie Sie es tun, und gleichzeitig eine Seite mit demselben Slug (London). Dieses Umschreiben funktioniert nur, wenn die URL mit dem Namen der Region beginnt und einen “Pfad” mehr hat. Wenn Baum oder Eins nicht übereinstimmen, brechen Sie daher andere Umschreibregeln nicht.

Ist nur eine Idee, ich hoffe das hilft dir 🙂