it-swarm.dev

Jak mohu do okna příloh přidat pole URL?

Například...

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

Přidá vstupní pole "Kategorie" do editoru médií a příloh. Chtěl bych vědět, zda je možné tuto funkci změnit tak, aby místo toho zachytila ​​adresu URL odkazu. Adresa URL bude provedena po klepnutí na obrázek.

Také je třeba vědět, jak načíst hodnotu pro toto nové pole.

UPDATE: Díky Thomasovi odpovědi níže je zde mé konečné řešení ...

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); 
12
Scott B

Používám velmi hrubý plugin přidat informace o interpreta a URL na mediální soubory. Potřebuje nějaké vylepšení (a potřebuju čas), ale funguje to a může ukázat, jak přidat další pole a jak je použít ve vašem motivu:

<?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
}
15
fuxia

V reakci na Drewovu otázku v komentářích si můžete přizpůsobit HTML pro pole nastavením input na nový řetězec a poté přidáním tohoto stejného řetězce jako klíče do pole $form_fields.

Ve výchozím nastavení bude WordPress přijímat pouze text a textarea pro typ input. Cokoliv jiného bude muset být definováno obvyklým způsobem, jak je uvedeno níže. Nepokoušel jsem se vlastně přetrvávat pole formuláře tímto způsobem, aby se další vstupní typ, jako přepínač, může trvat trochu extra jemnost.

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!"
        );
}
0
Jeff