Página de edición de categoría personalizada de WordPress
Agregar metaboxes, campos y otra información adicional a WordPress es fácil si conoce los ganchos correctos y las API adecuadas a seguir. Pero, ¿qué sucede si desea agregar información a una página de taxonomía de WordPress?
Por ejemplo, digamos que desea crear una página personalizada de edición de categorías de WordPress o, al menos, agregar información personalizada a una página de taxonomía.
Todavía es posible hacer eso, y sigue siendo relativamente fácil pero, nuevamente, necesita conocer los ganchos correctos para usar, y también depende de si está trabajando con las taxonomías integradas o con una taxonomía personalizada.
Para esta publicación, mostraré cómo hacer esto usando una taxonomía jerárquica personalizada (o, en términos más simples, una categoría personalizada).
Página de edición de categoría personalizada de WordPress
Primero, si opta por trabajar con una página de categoría estándar, es probable que vea algo como esto:
Y los dos ganchos con los que tienes que trabajar son:
Si ha hecho clic en cualquiera de los enlaces, notará que el último no tiene ninguna información, pero el primero dice:
La acción/gancho edit_category_form se puede utilizar para realizar acciones adicionales en la pantalla de edición de categoría. Por ejemplo, puede agregar campos de formulario para guardar información adicional para una categoría en particular.
Con ese fin, generalmente opto por usar ese gancho ya que está bien definido en el Codex. En esta publicación, sin embargo, solo me preocupa la representación de la información, no la adición de campos adicionales que deben guardarse.
Cableando las cosas
En la forma más simple, la mejor manera de comenzar a agregar información personalizada a este tipo de página es crear una función y adjuntarla al enlace mencionado anteriormente. En su forma más básica, esto se parece a esto:
<?php
add_action('edit_category_form', 'acme_display_object_ids');
/**
* Displays an ordered list of all of the object IDs for a given
* taxonomy.
*/
function acme_display_object_ids()
{
// Code for displaying the Object IDs goes here.
}
Sin embargo, si opta por la ruta orientada a objetos, puede optar por tener una clase que acepte un gancho como argumento en el constructor y escuche que se active ese evento. Si ese es el caso, entonces su código puede verse así:
<?php
class ObjectIdSubscriber
{
/**
* @var string the hook to which this class subscribes
*/
private $hook;
/**
* @param string $hook the hook to which this class is registered with WordPress
*/
public function __construct(string $hook)
{
$this->hook = $hook;
}
/**
* Renders all of the information for the object IDs.
*/
public function load()
{
// Code for displaying the Object IDs goes here.
}
}
Independientemente, el punto es que necesita tener una clase o una función que esté conectada a un gancho que muestre información cuando se presente la pantalla.
Mostrar información
A partir de aquí, vas a necesitar algo para renderizar. Soy fanático de mantener mi lógica separada, por lo que generalmente creo un directorio de vista y luego coloco los archivos parciales para las vistas en ese directorio.
Por supuesto, siempre puede crear la cadena HTML en la función PHP (pero asegúrese de desinfectar la salida usando algo como wp_kses ).
Para este ejemplo, lo mantendré simple: solo quiero obtener una lista de todas las publicaciones (u objetos, como verá en un momento) de la base de datos y enumerar la información en la página. Para hacer esto, necesitaré un par de consultas a la base de datos y luego puedo iterar a través de la lista de resultados.
Primero, necesito una consulta que recupere term_taxonomy_id de la categoría dada:
<?php
// This will retrieve all of the term relationships from where we can get post IDs.
global $wpdb;
$termTaxonomyId = $wpdb->get_results(
$wpdb->prepare(
"
SELECT DISTINCT term_taxonomy_id
FROM $wpdb->term_taxonomy
WHERE term_id = %s
",
$tagId
),
ARRAY_A
);
$termTaxonomyId = isset($termTaxonomyId[0])? $termTaxonomyId[0]: null;
if (null === $termTaxonomyId) {
return null;
}
Luego, necesito recuperar una lista de todos los ID de objeto que están relacionados con este term_taxonomy_id :
<?php
// This will retrieve all of the post IDs.
$postIds = $wpdb->get_results(
$wpdb->prepare(
"
SELECT object_id
FROM $wpdb->term_relationships
WHERE term_taxonomy_id = %s
",
$termTaxonomyId
),
ARRAY_A
);
if (empty($postIds)) {
return null;
}
Desde aquí, puedo usar la función (o clase) original que creé anteriormente para representar la información :
<ul>
<?php foreach ($postIds as $postId): ?>
<li><?php echo $postId; ?></li>
<?php endforeach; ?>
</ul>
Pero hay muchas cosas adicionales que puede hacer desde allí.
Hay más
Como se señaló, esto devuelve las ID de los objetos que son esencialmente ID de publicación (o ID de página o ID de tipo de publicación personalizada o lo que sea de la tabla wp_posts ).
Una vez que tenga esa información, puede recuperar cualquier información, como el título, el contenido, los metadatos, información diversa sobre fechas, etc.
Sin embargo, el objetivo de la publicación no es mostrar qué información recuperar, sino cómo recuperar información para una taxonomía determinada y luego representarla en una página de categoría personalizada de WordPress. Y esta es una forma sencilla de hacer exactamente eso.
