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

20 окт. 2010 г., 21:49:43
Просмотры: 4.36K
Голосов: 13

Например...

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" => __("Ссылка изображения ведет на"),  
        "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
Комментарии

Не используйте "my_" в качестве "пространства имен" для ваших функций. Уже слишком много людей так делают. ;)

fuxia fuxia
22 окт. 2010 г. 05:35:13

Было бы интересно узнать, как использовать это с радиокнопкой. Изменение типа ничего не дает.

Drew Baker Drew Baker
3 окт. 2012 г. 03:39:40

@scottb Вместо того чтобы помещать ваше решение в вопрос, вам следует вырезать его оттуда и вставить в ответ, а затем принять этот ответ. Некоторые люди считают, что в принятии собственного ответа есть что-то неправильное, но это нормально, и это помогает будущим поискам (вроде меня) быстрее находить реальный ответ.

Jeff Jeff
11 нояб. 2015 г. 21:02:17
Все ответы на вопрос 2
1
16

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

<?php
/*
Plugin Name: Поле автора медиа
Description: Добавляет два поля к вложениям — Автор и URL автора — и включает эту информацию в подписи.
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'  => 'Фотограф (Имя)'
        )
    ,   'artist_url' => array (
            'public' => 'artist_url'
        ,   'hidden' => '_artist_url'
        ,   'label'  => 'Фотограф (URL)'
        )
    )
,   'Фото: '
);
/**
 * Добавляет два поля для указания авторства к любому медиафайлу: имя и URL.
 *
 * Основано на понятном руководстве от 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_url' => array (
                'public' => 'artist_url'
            ,   'hidden' => '_artist_url'
            ,   'label'  => 'URL автора'
            )
        )
        // Возможно, собственное поле?
    ,   $caption_prefix
    ,   $br_before = TRUE;

    public function __construct(
        $fields         = array()
    ,   $caption_prefix = 'Источник: '
    ,   $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 = '')
    {
        /* Типичный ввод:
         * [caption id="attachment_525" align="aligncenter"
         * width="300" 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
            )
        );

        // Пусть WordPress обработает эти случаи.
        if ( empty ($id ) or 1 == $nocredits )
        {
            return '';
        }

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

        if ( ! empty ( $id ) )
        {
            // Пример: 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);

            // Хорошо, есть хотя бы одно значение.
            if ( '' != $artist_name . $artist_url )
            {
                $sub_caption .= $this->br_before ? '<br />' : '';
                $sub_caption .= '<span class="media-artist">' . $this->caption_prefix;

                // Имя не указано. Используем сокращенный URL.
                if ( '' == $artist_name )
                {
                    $sub_caption .= '<a rel="author" href="'
                        . $artist_url . '">'
                        . $this->short_url($artist_url)
                        . '</a>';
                } // У нас есть только имя.
                elseif ( '' == $artist_url )
                {
                    $sub_caption .= $artist_name;
                } // У нас есть и то, и другое.
                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
}
21 окт. 2010 г. 05:59:19
Комментарии

Для очень "грубого" плагина у вас очень приличный стиль кодирования. Двойные большие пальцы вверх скрещены!

hakre hakre
20 нояб. 2010 г. 04:53:51
0

Отвечая на вопрос Дрю в комментариях, вы можете настроить 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" => __("Введите что-нибудь"), // Перевод строки
            "input" => "arbitrary_value",
            "value" => get_post_meta($post->ID, "some_new_field", true),
            "arbitrary_value" => "hello world!"
        );
}
11 нояб. 2015 г. 20:59:56