Как добавить поле URL в окно вложений?
Например...
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);

Я использую очень простой плагин для добавления информации об авторе и 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
}

Отвечая на вопрос Дрю в комментариях, вы можете настроить 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!"
);
}
