Use register_post_type () para modificar un tipo de publicación existente


29

Hay muchas situaciones en las que un tema o complemento registra un tipo de publicación y desea modificarlo. Hay, por supuesto add_post_type_support(), y remove_post_type_support(), pero los que no dan acceso a la lista completa de los argumentos que register_post_type()se necesita. En particular, tal vez quiera deshabilitar un archivo de tipo de publicación, ocultar la IU del administrador, ocultar de la búsqueda, etc., dejando el resto de la configuración del tipo de publicación sola.

La página del Codexregister_post_type() cuelga esto delante de mí:

Descripción

Crear o modificar un tipo de publicación.

Pero en el pasado, cuando intenté hacer esto, no parecía funcionar. ¿Es esta función realmente para modificar los tipos de publicación, y si es así, puede simplemente redeclarar un par de argumentos y dejar el resto solo?

Al ver que ni siquiera hay una deregister_post_type()función , no entiendo cómo se puede hacer.

Respuestas:


18

¿Es esta función realmente para modificar tipos de publicaciones?

Sí.

y si es así, ¿puedes simplemente declarar un par de argumentos y dejar el resto solo?

No. Si desea modificar los argumentos a un tipo de publicación, debe usarlo get_post_type_objectpara obtener el objeto de tipo de publicación, modificar lo que desea en él y luego volver a registrarlo utilizando su tipo modificado como el nuevo parámetro $ args.


¿Sería register_post_typecorrecto hacer dos llamadas consecutivas con argumentos modificados iguales ? Supongo que sí por su "Sí", y no arroja ningún error y tiene el efecto deseado. El caso real es la segunda opción que presento en esta respuesta: wordpress.stackexchange.com/a/74331/12615
brasofilo

Sí, eso funciona, pero parece que si tiene que hacer eso, entonces necesita agregar algunos filtros u otra cosa para evitar tener que registrar repetidamente el mismo tipo de publicación una y otra vez. Básicamente, primero resuelva los argumentos, luego regístrelos.
Otto

Solo lo pensé por el gancho proporcionado justo antes del complemento register_post_type. En realidad, no hay necesidad. Fue una pregunta "para los registros", gracias por los comentarios.
brasofilo

34

Después de algunas investigaciones, encontré que ninguna de estas respuestas está actualizada.

A partir del 8 de diciembre de 2015, WordPress incluye un nuevo filtro register_post_type_args, que le permite engancharse a los argumentos de un tipo de publicación registrada.

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

66
Esta es la forma correcta de hacer esto ahora.
Dave Romsey

66
Esta debería ser la respuesta aceptada
klewis

¿Qué sucede si necesita actualizarlo después de que se haya registrado en tiempo de ejecución? Por ejemplo: despuésinit
Lucas Bustamante

@LucasBustamante No importa. Simplemente llame a la línea 'add_filter' durante su complemento / tema, no en una acción. Se llamará al filtro durante cada register_post_typefunción. El único escenario en el que mi código no funcionará es si el tipo de publicación no se registra correctamente. Todos los tipos de publicaciones deben registrarse durante el enlace de inicio. Desde el códice: "register_post_type no funcionará si se llama antes de 'init', y los aspectos del tipo de publicación recién creado o modificado funcionarán incorrectamente si se llama más tarde". Si aún necesita ayuda, le sugiero publicar más detalles en una nueva pregunta.
Radley Sustaire

8

Aquí hay un ejemplo de cómo usar el 'registered_post_type'filtro para modificar un tipo de publicación en otro complemento.

Un complemento que estaba usando no incluía un menu_icon en su definición, por lo que quería agregar uno propio.

<?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 );

Esta es una forma mucho más limpia de hacerlo en la mayoría de los casos; Sin embargo, debe tenerse en cuenta que este filtro es demasiado tarde para ser recogido por reescrituras, por lo que la respuesta aceptada debe utilizarse en esas situaciones.
mrwweb

4

Enganche 'registered_post_type'después de que el otro código lo haya registrado. Se llama al final de register_post_type(). Obtienes dos argumentos: $post_typey $args.
Ahora puedes cambiar cualquier cosa para este tipo de publicación. Inspeccionar $GLOBALS['wp_post_types']algunas opciones.


Gracias por señalarme hacia ese gancho. Eso responde a la pregunta (más importante) acerca de cómo modificar un tipo de publicación, pero ¿qué pasa con la descripción register_post_type()que incluye "modificar"? ¿Eso está mal? ¿Debería subirme a mi caballo de internet y vencerlo del Codex en este momento?
mrwweb

2
$wp_post_types[$post_type] = $args;... sugiere que debería poder cambiar las propiedades. Agregue un ejemplo del código que falla a su pregunta.
fuxia

0

Me enfrenté a lo mismo con el complemento Calendario de eventos .

Agregué el siguiente código a function.php para modificar el tipo de publicación tribe_organizer

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

No sé si esto es feo, pero podría alterar el GLOBALmarcador de posición "sobre la marcha" cada vez que necesite manipular un solo argumento. Así es como usamos un tipo de publicación no pública contentspara ser aceptable en el menú de administración. Enganchamos antes y cerramos después de que el menú muestra:

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

En nuestro caso, queremos que el complemento Lista de publicaciones del menú Admin acepte nuestro tipo de publicación, ya que llaman return get_post_types(array('public' => true));dentro de su enlace con prioridad 11 ...

Desarrolladores -Hagan un comentario si esto puede causar algún problema.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.