Cum pot adăuga un câmp URL în fereastra atașamentelor?

20 oct. 2010, 21:49:43
Vizualizări: 4.36K
Voturi: 13

De exemplu...

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

Adaugă un câmp de intrare "Categorie" în managerul de media și editorul de atașamente. Aș dori să știu dacă este posibil să modific această funcție pentru a capta un URL "destinație link" în schimb. URL-ul ar fi executat când imaginea este făcută click.

De asemenea, trebuie să știu cum să preiau valoarea acestui câmp nou.

ACTUALIZARE: Mulțumită răspunsului lui Thomas de mai jos, iată soluția mea 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); 
3
Comentarii

Nu "namespace"-ui funcțiile cu "my_". Prea mulți oameni fac deja asta. ;)

fuxia fuxia
22 oct. 2010 05:35:13

Aș dori să știu cum să folosesc asta cu un buton radio. Schimbarea tipului nu face nimic.

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

@scottb În loc să pui soluția în întrebare, ar trebui să o tai de acolo și să o lipesti într-un răspuns, apoi să-l accepti. Unii oameni cred că e ciudat să-ți accepti propriul răspuns, dar e în regulă și ajută la găsirea mai rapidă a soluției în viitor (cum a fost cazul meu).

Jeff Jeff
11 nov. 2015 21:02:17
Toate răspunsurile la întrebare 2
1
16

Folosesc un plugin foarte simplu pentru a adăuga informații despre artist și o URL la fișierele media. Are nevoie de unele ajustări (și eu am nevoie de timp), dar funcționează și poate demonstra cum să adaugi câmpuri suplimentare și cum să le folosești în tema ta:

<?php
/*
Plugin Name: Media Artist Field
Description: Adaugă două câmpuri la atașamente – Artist și URL Artist – și adaugă aceste informații la subtitrări.
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 (Nume)'
        )
    ,   'artist_url' => array (
            'public' => 'artist_url'
        ,   'hidden' => '_artist_url'
        ,   'label'  => 'Fotograf (URL)'
        )
    )
,   'Foto: '
);
/**
 * Adaugă două câmpuri pentru creditare la orice fișier media: nume și URL.
 *
 * Bazat pe tutorialul clar al lui 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'  => 'Nume Artist'
            )
        ,   'artist_url' => array (
                'public' => 'artist_url'
            ,   'hidden' => '_artist_url'
            ,   'label'  => 'URL Artist'
            )
        )
        // Poate propriul său câmp?
    ,   $caption_prefix
    ,   $br_before = TRUE;

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

        // Lasă WP să se ocupe de aceste cazuri.
        if ( empty ($id ) or 1 == $nocredits )
        {
            return '';
        }

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

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

            // Ok, cel puțin o valoare.
            if ( '' != $artist_name . $artist_url )
            {
                $sub_caption .= $this->br_before ? '<br />' : '';
                $sub_caption .= '<span class="media-artist">' . $this->caption_prefix;

                // Nu este dat un nume. Folosim URL-ul scurtat.
                if ( '' == $artist_name )
                {
                    $sub_caption .= '<a rel="author" href="'
                        . $artist_url . '">'
                        . $this->short_url($artist_url)
                        . '</a>';
                } // Avem doar numele.
                elseif ( '' == $artist_url )
                {
                    $sub_caption .= $artist_name;
                } // Avem ambele.
                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 dezinstalare
}
21 oct. 2010 05:59:19
Comentarii

Pentru un plugin foarte "brut", ai un stil de codare destul de decent. Două degete mari încrucișate în semn de apreciere!

hakre hakre
20 nov. 2010 04:53:51
0

Răspundând la întrebarea lui Drew din comentarii, puteți personaliza HTML-ul pentru câmp prin setarea input la un șir nou, apoi adăugând același șir ca cheie în array-ul $form_fields.

Implicit, WordPress va accepta doar text și textarea pentru tipul input. Orice altceva va trebui definit într-un mod personalizat, așa cum este prezentat mai jos. Nu am încercat de fapt să persist câmpurile formularului în acest fel, așa că pentru a crea un alt tip de input, cum ar fi un buton radio, ar putea fi nevoie de puțină muncă suplimentară.

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

    $form_fields["some_new_field"] = array(  
            "label" => __("Scrie ceva"), // Tradus: "Type something"
            "input" => "arbitrary_value",
            "value" => get_post_meta($post->ID, "some_new_field", true),
            "arbitrary_value" => "hello world!"
        );
}
11 nov. 2015 20:59:56