La semana pasada empecé a escribir una serie sobre cómo crear un archivo de elementos propios en WordPress. De hecho, es en parte un making-of en directo de cómo se va construyendo esta página web.
En aquella entrada, describía cómo crear un plugin de WordPress propio y añadirlo al panel de control. Mi plugin deberá servir para guardar y clasificar las óperas que he sobretitulado hasta ahora, y hacer con ello un repertorio que se pueda buscar y mantener con facilidad.
Qué queremos conseguir
Una vez que ya tengo añadida al panel de control de WordPress la pestaña correspondiente, quiero una pantalla de edición que me permita crear una ópera, es decir, una entrada con los siguientes campos:
- Descripción: Sería el campo de texto en una entrada normal.
- Título: El título de la entrada, que es el título de la obra.
- Compositor: Aquí empiezan las curvas. Este va a ser uno de mis campos para clasificar e indexar las obras. Además, sería bonito que cada compositor tuviese su foto, fecha y lugar de nacimiento… Luego lo consideraré.
- Libretista: Sería bueno hacer algo parecido al compositor, y poder indexar también por libretista.
- Idioma original
- Idiomas de sobretitulado
- Representaciones: Una ficha donde podamos ver el teatro y las fechas en que se representó con estos sobretítulos, además de la dirección musical y de escena, por ejemplo
Como me suele ocurrir, al diseñar el plugin en sí surgen nuevas ideas. De momento, estoy observando que si quiero que cada compositor, libretista y teatro tengan una ficha propia, necesitaré crearles unos menús propios. Es decir, el usuario (yo) podrá crear un perfil de compositor, un perfil de libretista, un perfil de teatro y luego añadirlos a la ópera. Esto será una nueva misión… De momento, voy a centrarme en poder crear una ópera
Creando el elemento «Óperas»
Lo primero será registrar el tipo de post especial que va a ser una ópera. Con la función register_post_type, creo mi etiqueta y luego le añado algunos argumentos, que te explico en los comentarios del código, para crear una entrada particular como ópera. El resultado de esta operación, que he introducido al inicio del archivo repertoire.php, es que tengo una nueva opción en el menú principal de óperas.
/** Registro del tipo de post Ópera */
function register_opera() {
register_post_type('opera', array(
'labels' => array(
'name' => __( 'Óperas', 'textdomain'),
'singular_name' => __( 'Ópera', 'textdomain')
), // Los nombres con los que se guardará.
'public' => true, // Si se puede buscar desde fuera, es decir, xxxx.com/opera=ballo, por ejemplo
'has_archive' => true, // Tiene archivo propio. Una página de óperas
'rewrite' => array( 'slug' => 'operas' ), // a la que aquí doy una etiqueta particular
'show_in_menu' => 'repertoire', // Y así la añado al menú del plugin
));
}
add_action('init', 'register_opera');

Voilà! Ya puedo crear una ópera como si fuese un elemento más. Con este movimiento, acabo también de sustituir la «portada» de mi plugin por este menú de control. Así que voy a crear un submenú para poner las futuras opciones. Y, de paso, voy a copiar y pegar prácticamente el mismo código para poder crear, también, los compositores que irán ligados a cada ópera.
Este es el resultado final.

Ahora que ya tengo una infraestructura mínima, la siguiente misión será lograr que, al ir a crear una ópera, me aparezca un panel donde pueda elegir a un compositor para asignárselo. Hasta entonces, dejo el código completo tal cual está hasta ahora.
<?php /*
* Plugin name: Repertoire
* Description: Un plugin para construir un <?php /*
* Plugin name: Repertoire
* Description: Un plugin para construir un repertorio de óperas que me permita mostrarlas por compositor e idiomas disponibles.
* Version: 1.0
* Author: Alejandro Carantoña
* Author URI: https://alexcarantona.com
*/
/** Registro del tipo de post Ópera */
function register_opera() {
register_post_type('opera', array(
'labels' => array(
'name' => __( 'Óperas', 'textdomain'),
'singular_name' => __( 'Ópera', 'textdomain')
), // Los nombres con los que se guardará.
'public' => true, // Si se puede buscar desde fuera, es decir, xxxx.com/operas/ballo, por ejemplo
'has_archive' => true, // Tiene archivo propio. Una página de óperas
'rewrite' => array( 'slug' => 'operas' ), // a la que aquí doy una etiqueta particular
'show_in_menu' => 'repertoire', // Y así la añado al menú del plugin
));
}
add_action('init', 'register_opera');
/** Registro del tipo de post Compositor */
function register_compositor() {
register_post_type('compositor', array(
'labels' => array(
'name' => __( 'Compositores', 'textdomain'),
'singular_name' => __( 'Compositor', 'textdomain')
), // Los nombres con los que se guardará.
'public' => true, // Si se puede buscar desde fuera, es decir, xxxx.com/operas/ballo, por ejemplo
'has_archive' => true, // Tiene archivo propio. Una página de óperas
'rewrite' => array( 'slug' => 'compositores' ), // a la que aquí doy una etiqueta particular
'show_in_menu' => 'repertoire', // Y así la añado al menú del plugin
));
}
add_action('init', 'register_compositor');
/** Creando el menú */
function repertoire_admin_html() {
?>
<div class="wrap">
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
<p>Aquí pondré las opciones de mi repertorio</p>
<?php
}
function repertoire_admin_page() {
add_menu_page(
'Repertoire', // El título
'Repertoire', // El nombre que aparecerá en el menú de la izquierda
'manage_options', // Los permisos que debe tener el usuario
'repertoire', // Lo que aparecerá en las url
'',
'dashicons-playlist-audio', // El icono que se verá en el menú
);
}
add_action( 'admin_menu', 'repertoire_admin_page');
/** Creando el submenú de opciones */
function repertoire_options_page() {
add_submenu_page(
'repertoire',
'Opciones',
'Opciones',
'manage_options',
'opciones',
'repertoire_admin_html'
);
}
add_action( 'admin_menu', 'repertoire_options_page');
Deja una respuesta