it-swarm.com.de

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

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() akzeptiert. Insbesondere möchte ich möglicherweise ein Beitragstyparchiv deaktivieren, die Benutzeroberfläche des Administrators ausblenden, mich vor der Suche verstecken usw., während die restlichen Einstellungen für den Beitragstyp unverändert bleiben.

Die Codex-Seite für register_post_type() lässt dies vor meinen Augen baumeln:

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?

Als ich sehe, dass es nicht einmal eine deregister_post_type()-Funktion gibt , verstehe ich nicht, wie das gemacht werden kann.

25
mrwweb

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 Beitragstyp ändern möchten, müssen Sie get_post_type_object verwenden, um das Beitragstypobjekt abzurufen, die gewünschten Änderungen vorzunehmen und es dann mit dem geänderten Typ als neuem $ args-Parameter neu zu registrieren.

15
Otto

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_args, mit 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 );
31
Radley Sustaire

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 );
8
jjeaton

Hängen Sie sich in 'registered_post_type' ein, nachdem der andere Code ihn registriert hat. Es wird am Ende von register_post_type() aufgerufen. Sie erhalten zwei Argumente: $post_type und $args.
Jetzt können Sie für diesen Beitragstyp alles ändern. Untersuchen Sie $GLOBALS['wp_post_types'] auf einige Optionen.

4
fuxia

Ich weiß nicht, ob dies hässlich ist, aber Sie können den Platzhalter GLOBAL "on the fly" ändern, wenn Sie ein einzelnes Argument manipulieren müssen. So verwenden wir einen nicht öffentlichen Beitragstyp 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 es return get_post_types(array('public' => true)); in seinem Hook mit der Priorität 11 aufruft ...

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

0
Jonas Lundman

Das Gleiche habe ich mit The Events Calendar plugin erlebt.

Ich habe den folgenden Code zu function.php hinzugefügt, um den tribe_organizer post-Typ 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
Abouasy