Redeclare / Change Slug eines benutzerdefinierten Beitragstyps eines Plugins

Ist es möglich, den Slug des vorhandenen benutzerdefinierten Post-Typs eines Plugins zu reklamieren / ändern (ohne das Plugin einfach zu bearbeiten)?

Das heißt, wenn Plugin X einen benutzerdefinierten Post-Typ mit dem Slug / ungekochtem Toast / erstellt, ist es möglich, einen Filter zu functions.php (oder ähnlichem) hinzuzufügen, der den Slug in / bread /?

Solutions Collecting From Web of "Redeclare / Change Slug eines benutzerdefinierten Beitragstyps eines Plugins"

Ja, das ist möglich, aber wenn das Plugin einen benutzerdefinierten Post-Typ mit dem Parameter rewrite => array('slug' => 'post_type') , ist es unwahrscheinlich, dass Sie den Slug ersetzen können .

Wenn benutzerdefinierte Post-Typen erstellt werden, werden URL-Rewrite-Regeln in die database geschrieben. Abhängig davon, welche Aktion die Erstellung des benutzerdefinierten Post-Typs austriggers (z. B. die Aktion init ), löscht WordPress die Umschreibungsregeln und stellt die Slugs des benutzerdefinierten Post-Typs wieder her, unabhängig davon, welche Änderungen Sie vornehmen möchten.

Das heißt, Sie können benutzerdefinierte Slugs für die benutzerdefinierten Post-Typen bereitstellen. Im folgenden Beispiel wird davon ausgegangen, dass Sie einen benutzerdefinierten Beitragstyp für movies und dass Sie versuchen, /movies/ slug in /films/ zu ändern.

Um zu vervollständigen, hier ist die grundlegende function zum Definieren der benutzerdefinierten Post-Typ movies . Das Plugin, auf das Sie verweisen, sollte so etwas tun:

 function movies_register_post_type() { register_post_type( 'movies', array( 'labels' => array( 'name' => __('Movies'), 'singular_name' => __('Movie') ), 'public' => true, 'has_archive' => true, 'rewrite' => array( 'slug' => 'movies' ) ) ); } // end example_register_post_type add_action('init', 'movies_register_post_type'); 

Sie können die Optionstabelle ändern, indem Sie basierend auf dem vorhandenen Posttyp eigene benutzerdefinierte Regeln angeben.

Grundsätzlich werden wir das tun:

  • Nimm das bestehende Regelwerk und schreibe unser eigenes mit eigenen Slugs
  • Geben Sie der neuen Regel eine höhere Priorität als dem Slug des benutzerdefinierten Post-Typs

So können Sie dies tun:

 function add_custom_rewrite_rule() { // First, try to load up the rewrite rules. We do this just in case // the default permalink structure is being used. if( ($current_rules = get_option('rewrite_rules')) ) { // Next, iterate through each custom rule adding a new rule // that replaces 'movies' with 'films' and give it a higher // priority than the existing rule. foreach($current_rules as $key => $val) { if(strpos($key, 'movies') !== false) { add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top'); } // end if } // end foreach } // end if/else // ...and we flush the rules flush_rewrite_rules(); } // end add_custom_rewrite_rule add_action('init', 'add_custom_rewrite_rule'); 

Jetzt haben Sie zwei Möglichkeiten, auf Ihre Filme zuzugreifen:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Beachten Sie, dass ich nicht empfehle, die add_custom_rewrite_rule in die init Aktion add_custom_rewrite_rule da sie zu häufig add_custom_rewrite_rule wird. Dies ist nur ein Beispiel. Ein besserer Ort, um die function anzuwenden, wäre die Aktivierung des Themas, das Aktivieren des Plugins, vielleicht die Aktion save_post, usw. Je nachdem, was Sie tun müssen, müssen Sie es nur einmal oder nur wenige Male auslösen.

An dieser Stelle möchten Sie vielleicht in Betracht ziehen, die Permalinks für den benutzerdefinierten Post-Typ zu aktualisieren, um den ‘ /movies/ slug’ zu verwenden. Wenn Sie beispielsweise zu /films/ navigieren, /films/ Sie eine Auflistung aller Ihrer Filme, aber wenn Sie den Mauszeiger über den Titel bewegen, wird angezeigt, dass der /movies/ slug weiterhin verwendet wird.

Um einen Schritt weiter zu gehen, könnten Sie technisch eine 301-Weiterleitung einrichten, um alle Links zu /movies/ filmen /movies/ zu ihrem /films/ filmen /films/ Gegenstück umzuleiten, aber alles hängt davon ab, was Sie versuchen zu tun.

Dieser Code funktionierte gut für mein Kindthema. Benötigt, um “Programm” Slug zu “Ort” zu ändern.

 /* CHANGE SLUGS OF CUSTOM POST TYPES */ function change_post_types_slug( $args, $post_type ) { /*item post type slug*/ if ( 'program' === $post_type ) { $args['rewrite']['slug'] = 'place'; } return $args; } add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 ); /* CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages */ function change_taxonomies_slug( $args, $taxonomy ) { /*item category*/ if ( 'program-category' === $taxonomy ) { $args['rewrite']['slug'] = 'locations'; } return $args; } add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );