¿Cómo puedo agregar un campo de URL a la ventana de adjuntos?

20 oct 2010, 21:49:43
Vistas: 4.36K
Votos: 13

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); 
3
Comentarios

No uses "my_" como "namespace" para tus funciones. Demasiada gente ya hace eso. ;)

fuxia fuxia
22 oct 2010 05:35:13

Me encantaría saber cómo usar esto con un botón de radio. Cambiar el tipo no hace nada.

Drew Baker Drew Baker
3 oct 2012 03:39:40

@scottb En lugar de poner tu solución en la pregunta, deberías cortarla de ahí y pegarla en una respuesta y luego aceptarla. Algunas personas piensan que parece raro aceptar tu propia respuesta, pero está bien y ayuda a que las búsquedas futuras (como la mía) encuentren la respuesta real más rápido.

Jeff Jeff
11 nov 2015 21:02:17
Todas las respuestas a la pregunta 2
1
16

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
}
21 oct 2010 05:59:19
Comentarios

Para un plugin muy "rudimentario", tienes un estilo de codificación bastante decente. ¡Doble pulgar arriba cruzado!

hakre hakre
20 nov 2010 04:53:51
0

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!"
        );
}
11 nov 2015 20:59:56