Verwenden Sie register_post_type (), um einen vorhandenen Beitragstyp zu ändern


29

Es gibt viele Situationen, in denen ein Thema oder Plugin einen Beitragstyp registriert und Sie ihn ändern möchten. Es gibt natürlich add_post_type_support()und remove_post_type_support(), aber diese geben keinen Zugriff auf die vollständige Liste der Argumente, die register_post_type()benötigt werden. Insbesondere möchte ich möglicherweise ein Beitragstyparchiv deaktivieren, die Administrator-Benutzeroberfläche ausblenden, mich vor der Suche verstecken usw., während die restlichen Einstellungen für den Beitragstyp in Ruhe gelassen werden.

Die Codex-Seite fürregister_post_type() baumelt dies vor meinen Augen:

Beschreibung

Erstellen oder ändern Sie einen Beitragstyp.

Aber in der Vergangenheit schien es nicht zu funktionieren, als ich dies versuchte. Ist diese Funktion wirklich zum Ändern von Beitragstypen gedacht? Wenn ja, können Sie einfach ein paar Argumente neu deklarieren und den Rest in Ruhe lassen?

Da es nicht einmal eine deregister_post_type()Funktion gibt , verstehe ich nicht, wie das gemacht werden kann.

Antworten:


18

Ist diese Funktion wirklich zum Ändern von Beitragstypen

Ja.

und wenn ja, können Sie einfach ein paar Argumente neu erklären und den Rest in Ruhe lassen?

Nein. Wenn Sie Argumente für einen Post-Typ ändern möchten, müssen Sie get_post_type_objectdas Post-Typ-Objekt mithilfe von abrufen, die gewünschten Änderungen daran vornehmen und es dann mit dem geänderten Typ als neuem $ args-Parameter neu registrieren.


Wäre register_post_typees richtig , zwei aufeinanderfolgende Aufrufe mit modifizierten Argumenten zu tätigen ? Ich nehme das durch dein "Ja" an, und es wirft keine Fehler ab und hat den gewünschten Effekt. Der wahre Fall ist die zweite Option, die ich in dieser Antwort präsentiere: wordpress.stackexchange.com/a/74331/12615
brasofilo

Ja, das funktioniert, aber wenn Sie das tun müssen, müssen Sie einige Filter oder etwas anderes hinzufügen, um zu verhindern, dass Sie denselben Beitragstyp wiederholt registrieren müssen. Grundsätzlich sollten Sie die Argumente zuerst aussortieren und dann registrieren.
Otto

Ich habe gerade darüber nachgedacht, weil der Haken direkt vor dem Plugin bereitgestellt wurde register_post_type. In Wirklichkeit gibt es keine Notwendigkeit. Es war eine "for the records" Frage, danke für das Feedback.
Brasofilo

34

Nach einigen Recherchen habe ich herausgefunden, dass keine dieser Antworten aktuell ist.

Ab dem 8. Dezember 2015 enthält WordPress einen neuen Filter, register_post_type_argsmit dem Sie die Argumente eines registrierten Beitragstyps einbinden können.

function wp1482371_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "animal-species" ) {
        $args['rewrite'] = array(
            'slug' => 'animal'
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

6
Dies ist jetzt der richtige Weg.
Dave Romsey

6
Dies sollte die akzeptierte Antwort sein
Klewis 18.11.16

Was ist, wenn Sie es aktualisieren müssen, nachdem es zur Laufzeit registriert wurde? ZB: nachinit
Lucas Bustamante

@LucasBustamante Es spielt keine Rolle. Rufen Sie einfach die Zeile 'add_filter' während Ihres Plugins / Themes auf, nicht in einer Aktion. Der Filter wird bei jeder register_post_typeFunktion aufgerufen . Das einzige Szenario, in dem mein Code nicht funktioniert, ist, wenn der Beitragstyp nicht korrekt registriert wird. Alle Beitragstypen sollten während des Init-Hooks registriert werden. Aus dem Codex: "register_post_type funktioniert nicht, wenn es vor 'init' aufgerufen wird, und Aspekte des neu erstellten oder geänderten Post-Typs funktionieren nicht, wenn es später aufgerufen wird." Wenn Sie dennoch Hilfe benötigen, schlage ich vor, in einer neuen Frage weitere Details zu veröffentlichen.
Radley Sustaire

8

Hier ist ein Beispiel, wie Sie den 'registered_post_type'Filter verwenden, um einen Beitragstyp in einem anderen Plugin zu ändern.

Ein Plugin, das ich verwendet habe, enthielt kein menu_icon in seiner Definition, daher wollte ich eines meiner eigenen hinzufügen.

<?php
/**
 * Add a menu icon to the WP-VeriteCo Timeline CPT
 *
 * The timeline plugin doesn't have a menu icon, so we hook into 'registered_post_type'
 * and add our own.
 *
 * @param  string $post_type the name of the post type
 * @param  object $args the post type args
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Make sure we're only editing the post type we want
    if ( 'timeline' != $post_type )
        return;

    // Set menu icon
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modify post type object
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );

Dies ist in den meisten Fällen eine viel sauberere Methode. Es sollte jedoch beachtet werden, dass dieser Filter zu spät ist, um von Neuschreibungen erfasst zu werden, sodass in solchen Situationen stattdessen die akzeptierte Antwort verwendet werden muss.
Mrwweb

4

Hängen Sie ein, 'registered_post_type'nachdem der andere Code es registriert hat. Es heißt am Ende von register_post_type(). Sie erhalten zwei Argumente: $post_typeund $args.
Jetzt können Sie für diesen Beitragstyp alles ändern. Überprüfen Sie $GLOBALS['wp_post_types']für einige Optionen.


Danke, dass Sie mich auf diesen Haken gezeigt haben. Das beantwortet die (wichtigere) Frage, wie ein Beitragstyp geändert werden soll, aber wie sieht es mit der Beschreibung aus register_post_type(), die "Ändern" enthält? Ist das nur falsch Sollte ich in diesem Moment auf mein Internet-Pferd springen und es aus dem Codex streichen?
Mrwweb

2
$wp_post_types[$post_type] = $args;… Schlägt vor, dass Sie die Eigenschaften ändern können sollten. Fügen Sie Ihrer Frage ein Beispiel für den fehlerhaften Code hinzu.
fuxia

0

Das Gleiche habe ich mit dem Veranstaltungskalender- Plugin erlebt.

Ich habe den folgenden Code zu function.php hinzugefügt, um den Post-Typ von tribe_organizer zu ändern

function tribe_modify_organizer() {
 //New arguments
    $tribe_organizer_args = get_post_type_object('tribe_organizer'); // get the post type to modify
    $tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // add taxonomies support
    $tribe_organizer_args-> exclude_from_search = false; // show in search result
 //re-register the same post type includeing the new args
    register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );

0

Ich weiß nicht, ob dies hässlich ist, aber Sie können den GLOBALPlatzhalter "on the fly" ändern, wenn Sie ein einzelnes Argument manipulieren müssen. So verwenden wir einen nicht öffentlichen Post-Typ contents, um im Admin-Menü akzeptiert zu werden. Wir schließen vor und nach dem Rendern des Menüs:

function entex_theme_make_contents_public(){
    $GLOBALS['wp_post_types']['contents']->public = true;
}
add_action('admin_menu', 'entex_theme_make_contents_public', 10);

function entex_theme_make_contents_private_again(){
    $GLOBALS['wp_post_types']['contents']->public = '';
}
add_action('admin_menu', 'entex_theme_make_contents_private_again', 12);

In unserem Fall möchten wir, dass das Plugin "Admin Menu Post List" unseren Post-Typ akzeptiert, da er return get_post_types(array('public' => true));in seinem Hook mit Priorität 11 aufruft ...

Entwickler - Geben Sie bitte einen Kommentar ab, wenn dies Probleme verursachen könnte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.