¿Cómo puedo agregar un campo de URL a la ventana de adjuntos?
Por ejemplo...
add_action('init', 'reg_tax');
function reg_tax() {
register_taxonomy_for_object_type('category', 'attachment');
}
Agrega un campo de entrada "Categoría" al administrador de medios y editor de adjuntos. Me gustaría saber si es posible modificar esta función para capturar una URL de "destino del enlace" en su lugar. La URL se ejecutaría cuando se haga clic en la imagen.
También necesito saber cómo recuperar el valor para este nuevo campo.
ACTUALIZACIÓN: Gracias a la respuesta de Thomas, aquí está mi solución final...
function my_image_attachment_fields_to_edit($form_fields, $post) {
$form_fields["custom1"] = array(
"label" => __("La imagen enlaza a"),
"input" => "text",
"value" => get_post_meta($post->ID, "_custom1", true)
);
return $form_fields;
}
function my_image_attachment_fields_to_save($post, $attachment) {
if( isset($attachment['custom1']) ){
update_post_meta($post['ID'], '_custom1', $attachment['custom1']);
}
return $post;
}
add_filter("attachment_fields_to_edit", "my_image_attachment_fields_to_edit", null, 2);
add_filter("attachment_fields_to_save", "my_image_attachment_fields_to_save", null, 2);

Utilizo un plugin muy básico para agregar información sobre el artista y una URL a los archivos multimedia. Necesita algunos ajustes (y necesito tiempo), pero funciona y puede demostrar cómo agregar los campos adicionales y cómo usarlos en tu tema:
<?php
/*
Plugin Name: Campo de Artista para Medios
Description: Añade dos campos a los adjuntos – Artista y URL del Artista – y agrega esta información a los subtítulos.
Version: 0.1
Author: Fuxia Scholz
Created: 19.09.2010
*/
$Media_Artist = new Media_Artist(
array (
'artist_name' => array (
'public' => 'artist_name'
, 'hidden' => '_artist_name'
, 'label' => 'Fotógrafo (Nombre)'
)
, 'artist_url' => array (
'public' => 'artist_url'
, 'hidden' => '_artist_url'
, 'label' => 'Fotógrafo (URL)'
)
)
, 'Foto: '
);
/**
* Añade dos campos para créditos a cualquier archivo multimedia: nombre y URL.
*
* Basado en el claro tutorial de Andy Blackwell:
* @link http://net.tutsplus.com/?p=13076
*/
class Media_Artist
{
public
$fields = array (
'artist_name' => array (
'public' => 'artist_name'
, 'hidden' => '_artist_name'
, 'label' => 'Nombre del Artista'
)
, 'artist_url' => array (
'public' => 'artist_url'
, 'hidden' => '_artist_url'
, 'label' => 'URL del Artista'
)
)
// ¿Quizás su propio campo?
, $caption_prefix
, $br_before = TRUE;
public function __construct(
$fields = array()
, $caption_prefix = 'Fuente: '
, $br_before = TRUE
)
{
$this->fields = array_merge($this->fields, $fields);
$this->caption_prefix = $caption_prefix;
$this->br_before = (bool) $br_before;
$this->set_filter();
}
public function set_filter()
{
add_filter(
'attachment_fields_to_edit'
, array ( $this, 'add_fields' )
, 15
, 2
);
add_filter(
'attachment_fields_to_save'
, array ( $this, 'save_fields' )
, 10
, 2
);
add_filter(
'img_caption_shortcode'
, array ( $this, 'caption_filter' )
, 1
, 3
);
}
public function add_fields($form_fields, $post)
{
foreach ( $this->fields as $field)
{
$form_fields[ $field['public'] ]['label'] = $field['label'];
$form_fields[ $field['public'] ]['input'] = 'text';
$form_fields[ $field['public'] ]['value'] = get_post_meta(
$post->ID
, $field['hidden']
, TRUE
);
}
return $form_fields;
}
public function save_fields($post, $attachment)
{
foreach ( $this->fields as $field)
{
if ( isset ( $attachment[ $field['public'] ]) )
{
update_post_meta(
$post['ID']
, $field['hidden']
, $attachment[ $field['public'] ]
);
}
}
return $post;
}
public function caption_filter($empty, $attr, $content = '')
{
/* Entrada típica:
* [caption id="attachment_525" align="aligncenter"
* width="300" caption="El subtítulo."]
* <a href="http://example.com/2008/images-test/albeo-screengrab/"
* rel="attachment wp-att-525"><img
* src="http://example.com/uploads/2010/08/albeo-screengrab4.jpg?w=300"
* alt="" title="albeo-screengrab" width="300" height="276"
* class="size-medium wp-image-525" /></a>[/caption]
*/
extract(
shortcode_atts(
array (
'id' => ''
, 'align' => 'alignnone'
, 'width' => ''
, 'caption' => ''
, 'nocredits' => '0'
)
, $attr
)
);
// Dejar que WordPress maneje estos casos.
if ( empty ($id ) or 1 == $nocredits )
{
return '';
}
if ( 1 > (int) $width || empty ( $caption ) )
{
return $content;
}
if ( ! empty ( $id ) )
{
// Ejemplo: attachment_525
$html_id = 'id="' . esc_attr($id) . '" ';
$tmp = explode('_', $id);
$id = end($tmp);
$sub_caption = '';
$artist_name = get_post_meta($id, $this->fields['artist_name']['hidden'], TRUE);
$artist_url = get_post_meta($id, $this->fields['artist_url']['hidden'], TRUE);
// Bien, al menos un valor.
if ( '' != $artist_name . $artist_url )
{
$sub_caption .= $this->br_before ? '<br />' : '';
$sub_caption .= '<span class="media-artist">' . $this->caption_prefix;
// No se proporcionó nombre. Usamos la URL acortada.
if ( '' == $artist_name )
{
$sub_caption .= '<a rel="author" href="'
. $artist_url . '">'
. $this->short_url($artist_url)
. '</a>';
} // Solo tenemos el nombre.
elseif ( '' == $artist_url )
{
$sub_caption .= $artist_name;
} // Tenemos ambos.
else
{
$sub_caption .= '<a rel="author" href="'
. $artist_url . '">'
. $artist_name
. '</a>';
}
$sub_caption .= '</span>';
}
$caption .= $sub_caption;
}
return '<div ' . $html_id . 'class="wp-caption ' . esc_attr($align)
. '" style="width: ' . (10 + (int) $width) . 'px">'
. do_shortcode( $content ) . '<p class="wp-caption-text">'
. $caption . '</p></div>';
}
public function short_url($url, $max_length=20)
{
$real_length = mb_strlen($url, 'UTF-8');
if ( $real_length <= $max_length )
{
return $url;
}
$keep = round( $max_length / 2 ) - 1;
return mb_substr($url, 0, $keep, 'UTF-8') . '…'
. mb_substr($url, -$keep, $real_length, 'UTF-8');
}
# @todo desinstalar
}

Respondiendo a la pregunta de Drew en los comentarios, puedes personalizar el HTML del campo estableciendo el input
como una nueva cadena, y luego agregando esa misma cadena como una clave al array $form_fields
.
Por defecto, WordPress solo aceptará text
y textarea
para el tipo input
. Cualquier otra cosa tendrá que definirse de manera personalizada como se muestra a continuación. No he intentado realmente persistir campos de formulario de esta manera, por lo que para crear otro tipo de entrada, como un botón de radio, podría requerir un poco más de ajuste.
add_filter( 'attachment_fields_to_edit', 'change_fields', 10, 2 );
function change_fields( $form_fields, $post ) {
$form_fields["some_new_field"] = array(
"label" => __("Escribe algo"), // Traducción de "Type something"
"input" => "arbitrary_value",
"value" => get_post_meta($post->ID, "some_new_field", true),
"arbitrary_value" => "¡hola mundo!" // Traducción de "hello world!"
);
}
