Comment puis-je ajouter un champ URL à la fenêtre des pièces jointes?

12

Par exemple ...

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

Ajoute un champ de saisie "Catégorie" au gestionnaire de médias et à l'éditeur de pièces jointes. J'aimerais savoir s'il est possible de modifier cette fonction pour capturer une URL de "destination du lien" à la place. L’URL serait exécuté lors du clic sur l’image.

Vous devez également savoir comment récupérer la valeur de ce nouveau champ.

MISE À JOUR: Merci à Thomas Réponse ci-dessous, voici ma solution finale ...

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); 
    
posée Scott B 20.10.2010 - 20:49

2 réponses

15

J'utilise un plugin très approximatif pour ajouter des informations sur l'artiste et une URL pour les fichiers multimédias. Cela nécessite quelques ajustements (et j'ai besoin de temps), mais cela fonctionne et peut montrer comment ajouter des champs supplémentaires et comment les utiliser dans votre thème:

<?php
/*
Plugin Name: Toscho’s Media Artist Field
Description: Adds two field to attachments – Artist and Artist URL – and adds this information to captions.
Version:     0.1
Author:      Thomas Scholz
Author URI:  http://toscho.de
Created:     19.09.2010
*/
$Toscho_Media_Artist = new Toscho_Media_Artist(
    array (
        'artist_name' => array (
            'public' => 'toscho_artist_name'
        ,   'hidden' => '_toscho_artist_name'
        ,   'label'  => 'Fotograf (Name)'
        )
    ,   'artist_url' => array (
            'public' => 'toscho_artist_url'
        ,   'hidden' => '_toscho_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
 *
 * @author "Thomas Scholz"
 *
 */
class Toscho_Media_Artist
{
    public
        $fields = array (
            'artist_name' => array (
                'public' => 'toscho_artist_name'
            ,   'hidden' => '_toscho_artist_name'
            ,   'label'  => 'Artist Name'
            )
        ,   'artist_url' => array (
                'public' => 'toscho_artist_url'
            ,   'hidden' => '_toscho_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
}
    
réponse donnée fuxia 21.10.2010 - 04:59
0

En réponse à la question de Drew dans les commentaires, vous pouvez personnaliser le code HTML du champ en définissant input sur une nouvelle chaîne, puis en ajoutant cette même chaîne en tant que clé au tableau $form_fields .

Par défaut, WordPress n'accepte que text et textarea pour le type input . Tout le reste devra être défini de manière personnalisée comme ci-dessous. Je n'ai pas encore essayé de conserver les champs de formulaire de cette manière. Par conséquent, pour créer un autre type de saisie, un bouton radio, par exemple, un peu plus de finesse.

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!"
        );
}
    
réponse donnée Jeff 11.11.2015 - 19:59

Lire d'autres questions sur les étiquettes