scottb
  • 0
Гуру

Как добавить поле URL в окно вложений?

  • 0

Например…

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

Добавляет поле ввода «Категория» в медиа-менеджер и редактор вложений. Я хотел бы знать, возможно ли изменить эту функцию, чтобы вместо этого захватить URL-адрес «назначения ссылки». URL-адрес будет выполняться при нажатии на изображение.

Также нужно знать, как получить значение для этого нового поля.

ОБНОВЛЕНИЕ: благодаря ответу Томаса ниже, вот мое окончательное решение…

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); 
Share
  1. Не используйте «namespace» для ваших функций с «my_». Слишком много людей уже делают это. 😉

    • 0
  2. Я использую очень грубый плагин для добавления информации об исполнителе и URL-адреса в медиафайлы. Он нуждается в некоторой настройке (и мне нужно время), но он работает и может продемонстрировать, как добавить дополнительные поля и как их использовать в вашей теме:

    <?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:
             * 
    * <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>

    The 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 }
    • 0
  3. Отвечая на вопрос Дрю в комментариях, вы можете настроить HTML для поля, задав input новую строку, а затем добавив эту же строку в качестве ключа в $form_fields массив.

    По умолчанию WordPress будет принимать только text и textarea для input типа. Все остальное должно быть определено нестандартным способом, как показано ниже. Я не пробовал на самом деле сохранять поля формы таким образом, поэтому для создания другого типа ввода, например переключателя, может потребоваться немного больше изящества.

    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

Оставить ответ

You must login to add an answer.