• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar a la barra lateral principal

DecodeCMS

Tu WordPress a otro Nivel ...

  • Acerca de
  • Contacto
  • Inicio
  • Tutoriales
    • Themes
    • Plugins
    • Core
    • Recursos
  • Cursos
  • Acceder
    • Mis cursos
    • Mi Cuenta
    • Acceder
Inicio / Tutoriales / Core / Creación dinámica de Custom Post Types en WordPress

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

[ 23 febrero 2023 ] [ Actualizado: 25 febrero 2023 ]
[ Autor: Jhon Marreros Guzmán ][ Core - Avanzado] [ ]

funcionalidad optimización

Suscríbete a DecodeCMS:  

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.

 

¿Me ayudas a llegar a más gente?

Twittear Compartir LinkedIn WhatsApp

Artículos Relacionados

  • Eliminar el slug de la URL de un Custom Post TypeEliminar el slug de la URL de un Custom Post Type
  • Cambiar el tipo de Custom Post Type en WordPressCambiar el tipo de Custom Post Type en WordPress
  • Custom Post Types en WordPressUsando Custom Post Types en WordPress
  • Desactivar el acceso por correo electrónico en WordPressDesactivar el acceso por correo electrónico en WordPress
Valora este artículo : 1 barra2 barras3 barras4 barras5 barras (5 votos, promedio: 5,00 de 5)
Cargando...

Interacciones con los lectores

Comentarios

  1. fernando

    8 diciembre, 2024

    Tengo un conflicto con las URL, yo utilizo una estructura personalizada » /%category%/%postname%/ » para utilizar paginas de categoria personalizadas en vez de las categorias de siempre, por lo tanto, cuando creo un cpt me sale por defecto algo asi: mipagina/equipo/post-1/, el problema es que si creo la pagina de categoria «equipo», esta no se muestra y en su lugar se muestra una pagina donde estan listados todos los post del cpt, aun cuando modifico el 'slug' => $data['slug'] ?? $type, , tampoco funciona, siempre me manda a una pagina donde se muestran el listado de post. no se si puedas ayudarme a resolver esto?

Para escribir código envolver con: <pre class="language-xxx"><code> </code></pre> ,reemplaza las xxx (php, css, html)

*

* Gravatar habilitado

Barra lateral principal

Curso Decodifica WordPress

Únete a DecodeCMS

Recibirás como regalo:

Guia práctica con video:
¿Quieres agregar código a WordPress? Revisa las diferentes opciones que tienes.Ver más

Omnisend
Alojamiento Wordpress

Niveles

Básico Intermedio Avanzado

Etiquetas

accesibilidad css dashboard editor error funcionalidad herramientas imagen js librería mejoras optimización seguridad SEO social woocommerce

Populares

Mostrar el nombre de usuario en el menú de WordPress

Jerarquía de Archivos de Plantilla en WordPress

Mostrar lista de autores en WordPress

Clases CSS basadas en el Rol de usuario en WordPress

© logo decode pie
Política de Privacidad | Política de devoluciones
Copyrigth 2026 Todos los derechos reservados