Cum pot adăuga un câmp URL în fereastra atașamentelor?
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);

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
}

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