En un artículo anterior vimos cómo crear Custom Post Type (CPT) en WordPress, sin embargo si quieres crear más de un CPT no es necesario repetir todo el código. En este artículo veremos cómo crear CPT dinámicamente.
Generalidades
Recientemente tuve que realizar un proyecto en donde se tenían que crear varios CPT con código. A raíz de esto busque una forma de no repetir el código ya que los CPT eran similares y sólo tenían ciertas variaciones.
En la siguiente imagen vemos que inicialmente había creado un archivo por cada CPT, sin embargo al final sólo me quedé con un archivo que tiene código genérico y que se puede parametrizar para crear los CPT.
Código del archivo genérico
El siguiente código es parte del archivo generic_cpt.php que colocaremos en la carpeta cpt del tema hijo.
Este archivo crea una clase GenericCPT que al instanciar podemos pasar un array con los CPT a crear con sus respectivos parámetros.
<?php
class GenericCPT {
protected $settings;
function __construct( $settings ) {
$this->settings = $settings;
add_action( 'init', [ $this, 'add_custom_post_types' ] );
}
function add_custom_post_types() {
foreach ( $this->settings as $type => $data ) {
$labels = array(
'name' => _x( ucfirst( $type ), 'Post Type General Name', 'domain-child' ),
'singular_name' => _x( ucfirst( $type ), 'Post Type Singular Name', 'domain-child' ),
'menu_name' => __( ucfirst( $data['plural'] ), 'domain-child' ),
'name_admin_bar' => __( ucfirst( $data['plural'] ), 'domain-child' ),
'archives' => __( 'Archivo ' . $data['plural'], 'domain-child' ),
'attributes' => __( 'Atributos ' . $type, 'domain-child' ),
'parent_item_colon' => __( ucfirst( $data['plural'] ) . ' padre:', 'domain-child' ),
'all_items' => __( 'Todos', 'domain-child' ),
'add_new_item' => __( 'Agregar nuevo', 'domain-child' ),
'add_new' => __( 'Agregar', 'domain-child' ),
'new_item' => __( 'Nuevo', 'domain-child' ),
'edit_item' => __( 'Editar', 'domain-child' ),
'update_item' => __( 'Actualizar', 'domain-child' ),
'view_item' => __( 'Ver ' . $type, 'domain-child' ),
'view_items' => __( 'Ver ' . $data['plural'], 'domain-child' ),
'search_items' => __( 'Buscar ' . $type, 'domain-child' ),
'insert_into_item' => __( 'Insertar ' . $type, 'domain-child' ),
'uploaded_to_this_item' => __( 'Subir ' . $type, 'domain-child' ),
'items_list' => __( 'Lista ' . $type, 'domain-child' ),
'items_list_navigation' => __( 'Navegación ' . $data['plural'], 'domain-child' ),
'filter_items_list' => __( 'Filtro ' . $data['plural'], 'domain-child' ),
);
$rewrite = array(
'slug' => $type,
'with_front' => true,
'pages' => true,
'feeds' => true,
);
$args = array(
'label' => __( ucfirst( $type ), 'domain-child' ),
'description' => __( 'Contenido de ' . $data['plural'], 'domain-child' ),
'labels' => $labels,
'supports' => array( 'title', 'editor' ),
'taxonomies' => $data['taxonomies'] ?? [],
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 5,
'menu_icon' => $data['icon'],
'show_in_admin_bar' => true,
'show_in_nav_menus' => true,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'rewrite' => $rewrite,
'capability_type' => 'page',
'show_in_rest' => true,
);
register_post_type( $type, $args );
flush_rewrite_rules();
}
}
}
Usando la clase GenericCPT
Puedes usar el siguiente código desde el archivo functions.php de tu tema hijo.
Como puedes ver pasamos un array con los distingos CPT y sus diferentes parámetros, estos parámetros serán usados en la clase GenericCPT.
include_once "cpt/generic_cpt.php";
$cpt = [
"equipo" => [
"plural" => "equipos",
"icon" => "dashicons-groups",
"taxonomies" => ['category']
],
"jugador" => [
"plural" => "jugadores",
"icon" => "dashicons-smiley",
"taxonomies" => ['category']
],
"resultado" => [
"plural" => "resultados",
"icon" => "dashicons-calendar-alt"
]
];
new GenericCPT ( $cpt );
Conclusión
Como has podido comprobar, para evitar repetir código en la creación de un CPT puedes usar una clase genérica y pasar los parámetros correspondientes por cada CPT.
¿Aún con dudas?, en el siguiente video se detallan los puntos anteriores.
La entrada Creación dinámica de Custom Post Types en WordPress es un artículo reciente del sitio DecodeCMS.
0 Commentaires