Cómo alterar el orden de los campos personalizados en formularios

12 ene 2011, 22:59:23
Vistas: 485
Votos: 0

He agregado un campo "Título Personalizado" al editor de Categorías para capturar un título optimizado para SEO que pueda usarse separadamente del nombre de la categoría. Funciona bien, pero aparece como el último elemento de entrada en la pantalla de categoría. Idealmente, me gustaría que apareciera debajo del campo "Nombre" (o al menos en la parte superior). ¿Es esto posible?

Este es el código que estoy usando para agregar mi campo personalizado a la pantalla de edición de categorías...

if($pagenow == "edit-tags.php" && $_REQUEST['action'] == "edit") 
add_filter('edit_category_form', 'my_category_fields');

function my_category_fields($tag) {
$tag_extra_fields = get_option(MY_CATEGORY_FIELDS);?>
<table class="form-table">
    <tr class="form-field">
        <th scope="row" valign="top"><label for="categoryTitle">Título Completo de la Categoría</label></th>
        <td><input name="categoryTitle" id="categoryTitle" type="text" size="40" aria-required="false" value="<?php echo $tag_extra_fields[$tag->term_id]['cat_title']; ?>" />
        <p class="description">El título es opcional pero se usará en lugar del nombre en la página de destino de la categoría.</p></td>
    </tr>   
</table>
<?php
}
3
Comentarios

Sé que no es una respuesta, pero tengo curiosidad por saber por qué harías esto en primer lugar. ¿Es para distinguir un título de categoría legible por humanos de una versión optimizada para SEO que usas en la plantilla?

internetross internetross
12 ene 2011 23:38:02

En esencia, sí. El campo "Name" predeterminado está bien para listas, como cuando alguien coloca un widget "Categoría" en una barra lateral. Sin embargo, cuando estás viendo una página de destino de categoría, un título completamente descriptivo funciona mejor. Pero no usaría este "Título" en listas, ya que el campo "Name" predeterminado de la categoría es más apropiado para eso, en mi opinión.

Scott B Scott B
13 ene 2011 00:05:24

Hago lo mismo con los títulos de las publicaciones. Uso el título predeterminado de la publicación/página en menús y listas de navegación, pero cuando voy a mostrar el título de la publicación/página en single.php o page.php, uso un campo personalizado que captura un título más descriptivo (y amigable para SEO).

Scott B Scott B
13 ene 2011 00:07:13
Todas las respuestas a la pregunta 2
4

WordPress no proporciona los hooks que deseas, pero si estás dispuesto a usar el buffer de salida de PHP y preg_replace() puedes hacer que funcione sin modificar el núcleo. Aquí hay una respuesta que habla sobre la técnica general requerida:

Los hooks que querrás usar son 'category_pre_add_form' para ob_start() y 'category_add_form' para ob_get_clean().

13 ene 2011 11:02:21
Comentarios

Esa es una opción interesante Mike. También debería eliminar el problema de parpadeo inherente a la opción de javascript. ¡Gracias como siempre!

Scott B Scott B
13 ene 2011 15:52:46

Excelente idea.

MathSmath MathSmath
13 ene 2011 21:02:29

@Scott B - Sí, siempre prefiero hacerlo en PHP cuando sea posible. Me gusta usar jQuery para interactividad, no para parchear una generación de HTML menos que ideal porque, como mencionas, es mucho más limpio.

MikeSchinkel MikeSchinkel
14 ene 2011 01:18:03

@MathSmath - Gracias. He tenido un cliente que me ha presionado mucho y he aprendido que (casi) siempre hay alguna manera de hacerlo funcionar sin modificar el núcleo. Por supuesto, no siempre es bonito... :)

MikeSchinkel MikeSchinkel
14 ene 2011 01:18:58
2

No existe una solución basada en PHP sin modificar el núcleo. Si abres el archivo wp-admin/edt-tag-form.php lo verás. El hook que estás usando se ejecuta justo antes del botón de enviar, y el resto del formulario está codificado de forma rígida.

Pero probablemente puedas hacer esto con jQuery. Lee mi respuesta a esta pregunta similar para ver un ejemplo. El ejemplo es para la pantalla de edición de entradas, pero el concepto debería ser el mismo: usa el método insertBefore() de jQuery para mover un elemento (por ID) antes de otro elemento (por ID).

13 ene 2011 00:19:01
Comentarios

Me gusta tu idea con los fragmentos de jQuery. Pero parece que estoy atascado, ya que los campos de edición de categorías (los elementos TR) no tienen IDs asignados que pueda consultar con jQuery.

Scott B Scott B
13 ene 2011 04:36:54

Pensándolo mejor, como quiero insertar mi fila justo después de la primera fila de esa tabla, supongo que debería poder obtener otro medio de recorrido del DOM que no sea getElementsByID...

Scott B Scott B
13 ene 2011 04:39:44