Como posso adicionar um campo de URL à janela de anexos?


13

Por exemplo...

add_action('init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
}

Adiciona um campo de entrada "Categoria" ao gerenciador de mídia e ao editor de anexos. Gostaria de saber se é possível alterar essa função para capturar um URL de "destino de link". O URL seria executado quando a imagem fosse clicada.

Também é necessário saber recuperar o valor desse novo campo.

ATUALIZAÇÃO: Graças à resposta do Thomas abaixo, aqui está minha solução final ...

function my_image_attachment_fields_to_edit($form_fields, $post) {  
    $form_fields["custom1"] = array(  
        "label" => __("Image Links To"),  
        "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); 

1
Não "namespace" suas funções com "my_". Muitas pessoas já fazem isso. ;)
fuxia

Gostaria de saber como usar isso com um botão de opção. Mudar de tipo não faz nada.
Tirou Baker

@ scottb Em vez de colocar sua solução em questão, você deve cortá-la e colá-la em uma resposta e aceitar isso. Algumas pessoas pensam que algo parece errado em aceitar a própria resposta, mas tudo bem e isso ajuda pesquisas futuras (como eu) a obter a resposta real mais rapidamente.
11114 Jeff

Respostas:


16

Eu uso um plugin muito grosseiro para adicionar informações sobre o artista e uma URL aos arquivos de mídia. Ele precisa de alguns ajustes (e eu preciso do tempo), mas funciona e pode demonstrar como adicionar os campos extras e como usá-los no seu tema:

<?php
/*
Plugin Name: Media Artist Field
Description: Adds two field to attachments – Artist and Artist URL – and adds this information to captions.
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'  => 'Fotograf (Name)'
        )
    ,   'artist_url' => array (
            'public' => 'artist_url'
        ,   'hidden' => '_artist_url'
        ,   'label'  => 'Fotograf (URL)'
        )
    )
,   'Foto: '
);
/**
 * Adds two fields for credits to any media file: name and URL.
 *
 * Based on the clear tutorial by 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'  => 'Artist Name'
            )
        ,   'artist_url' => array (
                'public' => 'artist_url'
            ,   'hidden' => '_artist_url'
            ,   'label'  => 'Artist URL'
            )
        )
        // Maybe its own field?
    ,   $caption_prefix
    ,   $br_before = TRUE;

    public function __construct(
        $fields         = array()
    ,   $caption_prefix = 'Source: '
    ,   $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 = '')
    {
        /* Typical input:
         * [caption id="attachment_525" align="aligncenter"
         * width="300" caption="The caption."]
         * <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
            )
        );

        // Let WP handle these cases.
        if ( empty ($id ) or 1 == $nocredits )
        {
            return '';
        }

        if ( 1 > (int) $width || empty ( $caption ) )
        {
            return $content;
        }

        if ( ! empty ( $id ) )
        {
            // Example: 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);

            // Okay, at least one value.
            if ( '' != $artist_name . $artist_url )
            {
                $sub_caption .= $this->br_before ? '<br />' : '';
                $sub_caption .= '<span class="media-artist">' . $this->caption_prefix;

                // No name given. We use the shortened URL.
                if ( '' == $artist_name )
                {
                    $sub_caption .= '<a rel="author" href="'
                        . $artist_url . '">'
                        . $this->short_url($artist_url)
                        . '</a>';
                } // We have just the name.
                elseif ( '' == $artist_url )
                {
                    $sub_caption .= $artist_name;
                } // We have both.
                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 uninstall
}

2
Para um plugin muito "áspero", você tem um estilo de codificação bastante decente. Dois polegares para cima cruzados!
hakre

0

Respondendo à pergunta de Drew nos comentários, você pode personalizar o HTML do campo, definindo o inputpara uma nova sequência e adicionando a mesma sequência como uma chave à $form_fieldsmatriz.

Por padrão, o WordPress aceitará apenas texte textareapara o inputtipo. Qualquer outra coisa terá que ser definida de maneira personalizada, como abaixo. Eu não tentei realmente persistir campos de formulário dessa maneira, para criar outro tipo de entrada, como um botão de opção, pode ser um pouco mais delicado.

add_filter( 'attachment_fields_to_edit', 'change_fields', 10, 2 );
function change_fields( $form_fields, $post ) {

    $form_fields["some_new_field"] = array(  
            "label" => __("Type something"),
            "input" => "arbitrary_value",
            "value" => get_post_meta($post->ID, "some_new_field", true),
            "arbitrary_value" => "hello world!"
        );
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.