WordPress

Cómo crear publicaciones personalizadas en WordPress

Cómo crear Custom post types en WordPress

Introducción

En este tutorial vamos a crear un plugin que agregue dos nuevos tipos de publicaciones (post types) a WordPress. Luego crearemos nuevos diseños para ambos tipos de publicaciones usando plantillas. Si necesitas recordar cómo crear plugins, puedes consultar el tutorial sobre cómo crear un plugin de WordPress.

También habilitaremos la característica de Campos personalizados del editor de entradas para cada tipo de publicación y mostraremos los campos en las nuevas plantillas.

Estos Custom Post Types te dan un control total sobre la forma en que se le muestra el contenido a tus visitantes. Si escribes artículos en tu blog personal, puedes crear un diseño solo para ellos. Si también escribes reseñas de películas o de música, puedes agregar áreas de contenido adicionales a las publicaciones, pero no aparecerán en las publicaciones de tu blog.

Pero antes de continuar, revisemos que son los Custom Post Types (tipos de entradas personalizadas).

¿Qué son los Custom Post Types de WordPress?

En pocas palabras, los Custom Post Types de WordPress te permiten ordenar las publicaciones según su contenido. En WordPress, los tipos de publicación predeterminados son Entradas, Páginas, Adjuntos, etc.

Normalmente, escribes todas tus publicaciones en la sección Entradas del Panel de control de administrador y luego les asignas una categoría. Todas las entradas de todos los tipos aparecen en la misma lista, haciendo difícil su diferenciación por el tipo de contenido que contienen.

Los tipos de publicaciones personalizadas o Custom Post Types tienen su propio enlace en el panel de control de administrador, que dirige hacia una lista de publicaciones de ese tipo. A las publicaciones creadas de esta manera se les pueden asignar categorías como una publicación normal, por lo que tienes absoluta libertad para ordenar y presentar las entradas de la manera que quieras.Ejemplo de custom post types en wordpress

En el ejemplo anterior, si un usuario va a la sección de la base de datos de películas de tu sitio, las publicaciones de reseñas no están incluidas. Si creas, por ejemplo, categorías de ‘Acción’ y ‘Romance’, tus usuarios podrían ir a la página de categoría para las películas de Acción y ver todas las reseñas y entradas sobre películas para esa categoría.

Al crear un nuevo tipo de publicación tienes varias opciones como dónde mostrar el enlace en el menú de administración, decidir si quieres incluir ese tipo de publicación en los resultados de búsqueda o no, o admitir extractos, o si se permiten comentarios, etc.

Puedes cambiar varios elementos de texto (que se definen usando la matriz $labels), como cambiar el nombre de Añadir nueva entrada por Añadir nueva película. Por ejemplo, puedes cambiar el nombre de Imagen destacada por Añadir póster.

También puedes optar por habilitar la función de campos personalizados del editor de entradas, que está oculto de forma predeterminada y debe habilitarse mediante el enlace Opciones de pantalla en la parte superior del editor.

Continuando con el ejemplo de Películas y Reseñas de películas, a una publicación sobre películas le puedes agregar campos personalizados para elementos como el año de lanzamiento, director, calificación de IMDB, y demás, con la sinopsis de la película como el contenido de la publicación.Campos de una entrada personalizada

Normalmente, cualquier campo personalizado que crees se puede seleccionar en todos los tipos de publicaciones, por eso se necesita un plugin para limitar dónde aparece cada campo.

Crear nuevos tipos de publicaciones

Al realizar cambios significativos en WordPress, crear un plugin es una de las opciones disponibles. También puedes crear Custom post types en el archivo functions.php de una plantilla. Para este tutorial, crearemos un plugin y continuaremos usando el ejemplo de base de datos / reseñas de películas.

Para crear un tipo de publicación personalizada, debes escribir una nueva función que llame a la función de WordPress llamada register_post_type() con dos parámetros. Tu función debe estar enganchada al gancho de acción de init; de lo contrario, tu tipo de publicación personalizada no se registrará correctamente.

// The custom function MUST be hooked to the init action hook
add_action( 'init', 'lc_register_movie_post_type' );

// A custom function that calls register_post_type
function lc_register_movie_post_type() {

  // Set various pieces of text, $labels is used inside the $args array
  $labels = array(
     'name' => _x( 'Movies', 'post type general name' ),
     'singular_name' => _x( 'Movie', 'post type singular name' ),
     ...
  );

  // Set various pieces of information about the post type
  $args = array(
    'labels' => $labels,
    'description' => 'My custom post type',
    'public' => true,
    ...
  );

  // Register the movie post type with all the information contained in the $arguments array
  register_post_type( 'movie', $args );
}

Todas las funciones personalizadas deben tener un prefijo para evitar conflictos con otros plugins o funciones de plantillas. Voy a utilizar mis iniciales para este tutorial – LC.

Los dos parámetros para register_post_type() son:

¿Buscas un mejor hosting para tu sitio web?

Transfiere tu sitio web a la plataforma de hosting más rápida con soporte dedicado 24/7.

  1. El nombre del tipo de publicación, con máximo 20 caracteres y no debe contener espacios o mayúsculas
  2. Una matriz asociativa llamada $args que contiene información sobre el tipo de publicación en pares ‘key’ => ‘value’

Como los argumentos y las etiquetas son ambas matrices, es más limpio escribir primero las etiquetas en su propia variable, luego la variable $args, y luego llamar a la función.

La matriz $args

Las claves más utilizadas para la matriz $args aparecen a continuación, y todas son opcionales:

  • labels: una matriz que define varios fragmentos de texto, es decir, ‘Añadir nueva entrada’ puede renombrarse como ‘Añadir nueva película’. Las claves para la matriz de etiquetas se explican debajo de esta lista.
  • description: un resumen breve y descriptivo del tipo de publicación; puede mostrarse en la plantilla del tipo de publicación, pero no se usa en ningún otro lado.
  • public: define si el tipo de publicación es visible para autores y visitantes, el valor predeterminado es FALSE, lo que significa que ni siquiera aparece en el Panel de control de administración.
  • exclude_from_search – define si las publicaciones de este tipo aparecen en los resultados de búsqueda normales. El valor predeterminado es el opuesto al valor de public.
  • publicly_queryable: define si las publicaciones de este tipo se pueden acceder utilizando una URL como http://www.mywebsite.com/?post_type=movie, o en uso avanzado, a través de la función query_posts(). El valor predeterminado es el valor de public.
  • show_ui: define si los enlaces de menú y el editor de entradas están visibles en el Panel de control de administración. El valor predeterminado es el valor de public.
  • show_in_nav_menus – define si las publicaciones de este tipo se pueden agregar a los menús de navegación creados a través de la pantalla Apariencia -> Menús. El valor predeterminado es el valor de public.
  • show_in_menu: define dónde aparece el enlace del tipo de publicación en la barra de navegación del Panel de control de administración. FALSE oculta el enlace. TRUE agrega el enlace como un nuevo enlace de nivel superior. Ingresar una cadena de caracteres te permite colocar el enlace como un sub-enlace del enlace de nivel superior existente, es decir, ingresar options-general.php lo coloca bajo el enlace de Configuración.
  • show_in_admin_bar: define si este tipo de publicación aparece en la barra de administración superior, debajo del enlace + Nuevo.
  • menu_position – Posición del nuevo enlace en el menú de navegación del Panel de control de administración, 5 lo coloca debajo de Entradas, 100 lo coloca debajo de Configuración, visita la entrada Codex de WordPress para ver la lista completa de las posiciones.
  • hierarchical: define si las publicaciones se pueden asignar a una publicación principal, si su valor es TRUE, la matriz $supports debe contener la función ‘page-attributes’
  • supports: habilita de forma selectiva varias funciones de publicación, como imágenes destacadas, extractos, campos personalizados, etc. Si se establece en FALSO en lugar de en matriz, deshabilita el editor para este tipo de publicación, lo cual es útil si quieres bloquear todas las publicaciones de este tipo mientras las mantienes visibles (la lista de valores de matriz está abajo)
  • taxonomies: una matriz de taxonomías que se pueden aplicar a entradas de este tipo, las taxonomías ya deben estar registradas, ¡esto no las crea!
  • has_archive: define si el tipo de publicación tiene una página de archivo, la url sigue tu estructura de permalinks, y la descripción (slug) es el nombre que ingresaste en el parámetro 1 de register_post_types(), es decir, http://www.mywebsite.com/movie_reviews/ muestra todas las publicaciones de movie_review .
  • query_var – TRUE o FALSE establece si una publicación se puede ver escribiendo el tipo de publicación y el nombre de la publicación como una consulta en la URL, es decir, ‘http://www.mywebsite.com/?movie=the-matrix‘. Si escribes una cadena de texto, puedes configurar el texto para usar luego del caracter ?, por lo que ingresar ‘film’ resultaría en ‘?film=the-matrix‘ en su lugar.

La lista completa se puede ver en la página del Codex de WordPress para register_post_type().

La matriz de etiquetas

La primera clave de la matriz $args se denomina labels (etiquetas) y debe ser una matriz. Define varias piezas de texto relacionadas con el tipo de publicación. Como contiene mucha información, es mejor crear una variable llamada $labels para contenerla. El código de ejemplo anterior lo aclara.

A continuación se muestran algunas de las claves importantes para la matriz labels, todas son opcionales:

  • name: El nombre plural general para el tipo de publicación, por ejemplo, películas
  • singular_name: Nombre para una sola publicación de este tipo, por ejemplo, película
  • add_new: Reemplaza el texto ‘Añadir nuevo’, por ejemplo, ‘Añadir película’
  • add_new_item: Reemplaza ‘Agregar nueva publicación’, p. ‘Agregar nueva película’
  • edit_item: Reemplaza ‘Editar publicación’, p. ‘Editar pelicula’
  • featured_image: Reemplaza ‘Imagen destacada’ en el editor de publicaciones, p. ‘Cartel de la película’
  • set_featured_image: Reemplaza ‘Establecer imagen destacada’, es decir ‘Agregar póster de película’
  • menu_name: Cambia el texto del enlace de nivel superior, el texto predeterminado para el enlace es la clave del nombre

La lista completa se puede ver en la página del Codex de WordPress para register_post_type().

La matriz de “soportes”

// Enable specific features in the post editor for my post type
$supports = array ( 'title', 'editor', 'author', 'thumbnail' );

// Disable ALL features of the post editor for my post type
$supports = FALSE;

Una de las claves de la matriz $args se llama supports. Esta es una matriz simple en la que escribes la lista de características del editor de publicaciones que quieres habilitar para tu tipo de publicación personalizada. Por defecto, solo el título y el editor están habilitados.

También puedes escribir FALSO aquí en lugar de una matriz, para desactivar todas las funciones de edición de publicaciones, incluido el título y el área de contenido. Esto significa que las publicaciones no se pueden editar, pero siguen siendo completamente visibles.

Aquí está la lista de características del editor de entradas que puedes habilitar en la matriz $supports:

  • título
  • editor
  • autor – NOTA: esto le permite cambiar el autor de la publicación
  • miniatura
  • extracto
  • trackbacks
  • campos personalizados
  • comentarios
  • revisiones
  • atributos de página
  • formatos de entradas

Crear los nuevos tipos de publicaciones a través de un plugin

Ahora que sabemos qué información se necesita para la función, podemos construir nuestro plugin, escribir las funciones personalizadas y engancharlas en el enganche de acción init.

<?php
/*
Plugin Name: My Custom Post Types
Description: Add post types for movies and movie reviews
Author: Liam Carberry
*/
 
// Hook <strong>lc_custom_post_movie()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie' );
 
// The custom function to register a movie post type
function lc_custom_post_movie() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movies' ),
    'singular_name'      => __( 'Movie' ),
    'add_new'            => __( 'Add New Movie' ),
    'add_new_item'       => __( 'Add New Movie' ),
    'edit_item'          => __( 'Edit Movie' ),
    'new_item'           => __( 'New Movie' ),
    'all_items'          => __( 'All Movies' ),
    'view_item'          => __( 'View Movie' ),
    'search_items'       => __( 'Search Movies' ),
    'featured_image'     => 'Poster',
    'set_featured_image' => 'Add Poster'
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movies and movie specific data',
    'public'            => true,
    'menu_position'     => 5,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true,
    'query_var'         => 'film'
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // Parameter 2 is the $args array
  register_post_type( 'movie', $args);
}
 
// Hook <strong>lc_custom_post_movie_reviews()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie_reviews' );
 
// The custom function to register a movie review post type
function lc_custom_post_movie_reviews() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movie Reviews' ),
    'singular_name'      => __( 'Movie Review' ),
    'add_new'            => __( 'Add New Movie Review' ),
    'add_new_item'       => __( 'Add New Movie Review' ),
    'edit_item'          => __( 'Edit Movie Review' ),
    'new_item'           => __( 'New Movie Review' ),
    'all_items'          => __( 'All Movie Reviews' ),
    'view_item'          => __( 'View Movie Reviews' ),
    'search_items'       => __( 'Search Movie Reviews' )
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movie reviews',
    'public'            => true,
    'menu_position'     => 6,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // $args array goes in parameter 2.
  register_post_type( 'review', $args);
}

Si habilitas este plugin, verás dos enlaces nuevos en la barra de navegación del Panel de control de administración, justo debajo del enlace Entradas.

Al pasar el ratón sobre cualquiera de ellos, se mostrarán los subvínculos a ‘Ver todo’ y ‘Añadir nuevo’, el texto será lo que se definió en la matriz $labels relevante. Revisa el editor para ver cuáles etiquetas han cambiado.

Limitar los campos personalizados a un tipo de publicación específico

Al agregar campos personalizados a una publicación, el campo se guarda de manera que puedas agregarlo rápidamente a las publicaciones nuevas. Los campos personalizados que hayas agregado aparecerán en una lista desplegable en cada publicación. Esto puede hacer que sea difícil encontrar el campo que necesitas en tipos específicos de publicaciones. Si quieres limitar los campos personalizados para que solo puedan seleccionarse en determinados tipos de publicaciones, la forma más fácil es usar un plugin.

El plugin Advanced Custom Fields agrega un editor simple en WordPress que te permite crear campos personalizados y decirles que solo aparezcan en tu tipo de publicación.

Puedes definir qué tipo de información debe ir en el campo, como cuadro de texto, área de texto, dirección de correo electrónico, etc., o algo más avanzado, como insertar un mapa de Google Maps, donde puedes seleccionar una ubicación para resaltar y mostrar en sus publicaciones.vista del plugin Advanced Custom Fields

También puedes configurar en qué parte de la pantalla de edición se muestran los campos personalizados.

Como estos campos se crean a través de un plugin, debes usar las funciones de ese plugin para mostrarlos, esto se explica en la siguiente sección.

Diseñar nuevos tipos de publicaciones

Para crear plantillas de temas para tus nuevos tipos de publicaciones, solo tienes que crear archivos en el directorio principal de tu tema con el nombre correcto. Si no creas plantillas, WordPress usará single.php y archive.php, manteniendo todas tus publicaciones y archivos idénticos.

  • Plantilla para una publicación individual: single-{post-type}.php
  • Plantilla para una página de archivo: archive-{post-type}.php.

La parte {post-type} de los nombres de los archivos debe ser el nombre del parámetro 1 de register_post_type().

  • Para nuestro tipo de publicación de película, los nombres de archivo son single-movie.php y archive-movie.php.
  • Para nuestro tipo de publicación de reseñas de películas, los nombres de los archivos son single-review.php y archive-review.php.

La mejor manera de comenzar es duplicando single.php o archive.php y cambiarles el nombre como se muestra arriba. Esto significa que la estructura general es idéntica al resto de tu tema, y ​​todas las etiquetas de plantilla requeridas ya están en su lugar.

Mostrar campos personalizados en las publicaciones

Para mostrar los campos personalizados creados en el editor estándar de WordPress, puedes usar dos funciones.

// Generates all custom fields attached to the post in a <ul> list
the_meta();

// Get a specific piece of information
echo get_post_meta( $post->ID, 'Budget', TRUE );

Estas funciones deben ir en los archivos de plantilla utilizados para mostrar tu publicación.

the_meta()

Muestra todos los campos personalizados asociados a la publicación en una lista <ul>. Las etiquetas <ul> resultantes se ven así:

<ul class='post-meta'>
  <li>
    <span class='post-meta-key'>{your_key}</span> {your_value}
  </li>
</ul>

Esto funciona en cualquier lugar de la plantilla de publicación individual, pero si estás visualizando en otro lugar, debe estar dentro del bucle de WordPress.

get_post_meta()

Toma 3 parámetros y devuelve un resultado.

  • El primer parámetro es la ID de la publicación, puedes usar $post->ID aquí para obtener la ID de la publicación que se está viendo actualmente.
  • El segundo parámetro es el nombre del campo personalizado y distingue entre mayúsculas y minúsculas.
  • El tercer parámetro es un booleano llamado $single y puede tener valor TRUE (devuelve el resultado como una cadena) o FALSE (devuelve una matriz).

NOTA: Puedes crear múltiples campos personalizados con el mismo nombre y diferentes valores. Si existen varios campos con el mismo nombre, definir el valor en FALSE devolverá una matriz de todos ellos.

<?php
  $movie_box_art = get_post_meta( $post->ID, 'Box Art', TRUE );

if (!empty($movie_box_art)) { ?>
  <div class="movie-poster-box">
    <img src="<?php echo $movie_poster ?>" alt="<?php single_post_title(); ?> ">
  </div>
<? } ?>

Como la función get_post_meta() devuelve un valor, puedes usar el valor en una declaración condicional para cambiar el diseño de manera apropiada.

En el ejemplo anterior, verificamos si la película tiene un diseño de cuadro asignado mediante un campo personalizado. Si $movie_box_art no está vacío, repite el div y la imagen.

Visualización de Advanced Custom Fields

// Display field value
the_field( 'FIELD NAME' );

// Return field value
get_field( 'FIELD NAME' );

El plugin Advanced Custom Fields proporciona sus propias funciones y códigos abreviados para mostrar los campos.Nombre de campo en el plugin Advanced Custom Fields

the_field( ‘ FIELD NAME’ );

Esto muestra el valor del campo especificado, debes usar el nombre de campo que escribiste al crear el grupo de campo.

get_field( ‘FIELD NAME’ );

Esto devuelve el valor del campo especificado, útil para declaraciones condicionales.

Estas son las funciones que probablemente necesitarás. Hay muchas más funciones avanzadas, y puedes encontrarlas en la Documentación oficial.

Código

[acf field="FIELD NAME"]

Puedes visualizar los campos directamente en una publicación usando el código anterior.

Mostrar tipos de publicaciones personalizadas en la página principal

/ Hook our custom function to the pre_get_posts action hook
add_action( 'pre_get_posts', 'add_reviews_to_frontpage' );
 
// Alter the main query
function add_reviews_to_frontpage( $query ) {
    if ( is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'movie', 'review' ) );
    }
    return $query;
}

Los tipos de publicaciones personalizadas no se muestran en la página principal de manera predeterminada, por lo que debes escribir una nueva función que invoque el método set del objeto WP_Query de WordPress.

La función comprueba si el visitante está en la página de inicio y si la consulta activa es la principal generada por WordPress.

$query->set() toma dos parámetros:

  • El primer parámetro es la propiedad que deseas cambiar; en nuestro caso, queremos cambiar la propiedad post_type
  • El segundo parámetro es la matriz que quieres que sea el valor de la propiedad post_type

En el código anterior, la matriz comienza con ‘post’; esto se debe a que todas las entradas de WordPress tienen un tipo de publicación llamado ‘post’, y queremos incluirlas en la página principal.

Si solo quieres publicaciones personalizadas de un tipo determinado en la página principal, puedes eliminar ‘posts’ y solo usar tu tipo de publicación personalizada.

Agregamos ‘película’ y ‘reseña’ a la matriz, por lo que la página principal ahora muestra todas las publicaciones regulares, todas las publicaciones de películas y todas las publicaciones de reseñas.

El valor que ingreses debe ser el nombre que utilizaste en el parámetro 1 de la función register_post_type().

Conclusión

En este tutorial, aprendiste a crear tipos de publicaciones personalizadas (Custom post types) y qué información necesita darles. La flexibilidad que ofrecen los tipos de publicaciones personalizadas los convierte en una característica esencial para cualquier sitio web con WordPress.

Cuando se combina con categorías y taxonomías, tienes control total sobre la forma en que los usuarios ven tus publicaciones.

Agrega un Comentario

Dale clic aquí para dejar un comentario

This site uses Akismet to reduce spam. Learn how your comment data is processed.

¡Comienza a ahorrar hoy mismo!

Alojamientos con todo incluido y nombre de dominio por

AR$36
00
/mes