it-swarm.com.de

Redeclare/Change Slug des benutzerdefinierten Post-Typs eines Plugins

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

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

26
Edbury

Ja, das ist möglich, aber wenn das Plugin einen benutzerdefinierten Beitragstyp mit dem Parameter rewrite => array('slug' => 'post_type') erstellt, ist es unwahrscheinlich, dass Sie in der Lage sind, replace the slug.

Bei jeder Erstellung benutzerdefinierter Beitragstypen werden URL-Umschreiberegeln in die Datenbank geschrieben. Abhängig davon, welche Aktion die Erstellung des benutzerdefinierten Post-Typs auslöst (z. B. init action), löscht WordPress die Umschreiberegeln und stellt die Slugs des benutzerdefinierten Post-Typs wieder her, unabhängig davon, welche Änderungen Sie vornehmen möchten.

Sie können jedoch benutzerdefinierte Slugs für die benutzerdefinierten Beitragstypen bereitstellen. Im folgenden Beispiel wird davon ausgegangen, dass Sie einen benutzerdefinierten Beitragstyp movies haben und versuchen, den Slug /movies/ in /films/ zu ändern.

Um vollständig zu sein, hier ist die Grundfunktion, die zum Definieren des benutzerdefinierten Beitragstyps movies verwendet wird. Das Plugin, auf das Sie verweisen, sollte ungefähr so ​​aussehen:

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 Ihre eigenen benutzerdefinierten Regeln basierend auf dem vorhandenen Beitragstyp bereitstellen.

Grundsätzlich machen wir das:

  • Nehmen Sie die vorhandenen Regeln und schreiben Sie dann unsere eigenen mit unseren eigenen benutzerdefinierten Schnecken
  • Weisen Sie der neuen Regel eine höhere Priorität zu als dem Slug des benutzerdefinierten Beitragstyps

So können Sie das machen:

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, den add_custom_rewrite_rule in die Aktion init einzuhängen, da er zu häufig ausgelöst wird. Dies ist nur ein Beispiel. Ein besserer Ort, um die Funktion anzuwenden, ist die Themenaktivierung, die Plugin-Aktivierung, möglicherweise die Aktion save_post usw. Je nachdem, was Sie tun müssen, müssen Sie sie möglicherweise nur einmal oder nur ein paar Mal auslösen.

Möglicherweise möchten Sie an dieser Stelle die Permalinks für den benutzerdefinierten Beitragstyp so aktualisieren, dass der Slug '/movies/' verwendet wird. Wenn Sie beispielsweise zu /films/ navigieren, werden alle Ihre Filme aufgelistet. Wenn Sie jedoch den Mauszeiger über den Titel bewegen, wird festgestellt, dass der Slug /movies/ noch verwendet wird.

Um einen Schritt weiter zu gehen, können Sie technisch eine 301-Umleitung einleiten, um alle Links zu /movies/ abzufangen und zu ihrem /films/-Gegenstück umzuleiten. Dies hängt jedoch davon ab, was Sie tun möchten.

21
Tom

Dieser Code funktionierte gut für mein Kinderthema. 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 );
4
Iggy