Redeclare / Change Slug des Custom Post-Typs eines Plugins

28

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 Ähnliches) einen Filter hinzuzufügen, der den Slug in / bread / ändert?

Edbury
quelle
Ich habe gerade das gleiche Problem gelöst, indem ich mich in init mit der Priorität 20 einloggte und dann register_post_type erneut für den gleichen Beitragstyp aufrief. Weiß jemand, ob mir das irgendwann Probleme bereiten wird?
Dustin

Antworten:

24

Ja, das ist möglich, aber wenn das Plugin einen benutzerdefinierten Beitragstyp mithilfe des rewrite => array('slug' => 'post_type')Parameters erstellt, ist es unwahrscheinlich, dass Sie den Slug ersetzen können .

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. die Init- Aktion), werden in WordPress die Umschreiberegeln gelöscht und die Slugs des benutzerdefinierten Post-Typs wiederhergestellt, unabhängig davon, welche Änderungen Sie vornehmen möchten.

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

Um vollständig zu sein, hier ist die Grundfunktion, die zum Definieren des moviesbenutzerdefinierten Beitragstyps 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, die add_custom_rewrite_rulein die initAktion einzuhängen, da sie 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 für die Verwendung des /movies/Slugs aktualisieren . Wenn Sie beispielsweise zu navigieren /films/, werden alle Ihre Filme aufgelistet. Wenn Sie jedoch den Mauszeiger über den Titel bewegen, wird festgestellt, dass der /movies/Slug noch verwendet wird.

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

Tom
quelle
Hat wunderbar funktioniert! Könnten Sie mir auch die richtige Richtung zeigen, um die Permalinks zu aktualisieren?
Edbury,
1
Abhängig von Ihrem Thema können Sie dies auf Vorlagenebene tun. Wenn Sie den Aufruf von 'the_title ()' sehen, können Sie diesen durch $ title = get_the_title () ersetzen und dann '/ movies /' in $ title durch '/ films /' ersetzen.
Tom
Was ist, wenn der Slug, zu dem Sie wechseln möchten, dynamisch durch einen Metawert des aktuellen Posts erstellt wird? Ich muss in der Lage sein, $postin der add_custom_rewrite_rule()Funktion zu verwenden, aber es wirft Fehler in WP Admin mit der Aufschrift "Versucht, die Eigenschaft eines Nicht-Objekts zu erhalten". Wie kann ich $ post bekommen, um den Meta-Wert zu erhalten?
Lee
6

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 );
Iggy
quelle
Es funktioniert perfekt, ich habe es auch für die Tags verwendet, die die relative Regel hinzufügen. Es ist notwendig, die Permalinks zu aktualisieren, indem Sie auf der Einstellungsseite> Permalink einen Speichervorgang ausführen. Vielen Dank!
Lorenzo Magon
Funktioniert perfekt, um auch andere Argumente zu ändern, ich musste setzen $args['has_archive'] = falseund das funktionierte.
Nur Entwicklung