Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

Creación dinámica de Custom Post Types en WordPress

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.

Generación 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.

Suscríbete a DecodeCMS:  

 

La entrada Creación dinámica de Custom Post Types en WordPress es un artículo reciente del sitio DecodeCMS.

Enregistrer un commentaire

0 Commentaires