Die Medienverwaltung ist bei WordPress in einigen Bereichen sicher nicht vollkommen, aber sie bietet mit einer übersichtlichen Bedienung tolle Möglichkeiten. Jedes Attachment kann diverse Metadaten erhalten und auch WordPress speichert einige Daten direkt beim Upload – zum Beispiel einen Teil der Exif-Daten eines Bildes.
Trotzdem kann es sein, dass es nicht ausreicht und man bei der Verwendung von WordPress eigene zusätzliche Daten zum Attachment benötigt, sei es um im Backend von WordPress zu steuern oder auch um im Frontend Daten zum Bild auszugeben. Daher hier ein kleines Tutorial, in dem ein zusätzliches Feld ergänzt wird und ebenso eine Lösung, die direkt eingesetzt werden kann und ein neues Feld mit Hilfe eines Plugins ergänzt.
Für das Auslesen stelle ich eine einfache Methode dar, die entsprechend angepasst werden muss. Für das Auslesen der Daten zum Attachment stellt WordPress sehr viele wunderbare Funktionen bereit und damit lassen sich viele tolle Sachen realisieren – immer eine Frage der Kenntnis und des Können des Entwicklers – wie der zugehörige Artikel zeigt.
Der obige Screenshoot stellt das Ziel dar, ein Zusatzfeld mit dem Namen Example Custom Field, das Inputfeld dazu und einen erläuterten Text unterhalb des Feldes.
Feld hinzufügen
Im ersten Schritt erstellen wir eine Funktion, die die 3 neuen Inhalte in den Bereich der Attachment bringt. Diese Felder werden einem Array übergeben und im Anschluss durch den entsprechenden Hook attachment_fields_to_edit
in WordPress integriert.
// Add a custom field to an attachment in WordPress
function fb_attachment_fields_edit($form_fields, $post) {
$form_fields['custom_example']['label'] = __( 'Example Custom Field', FB_AAF_TEXTDOMAIN );
$form_fields['custom_example']['value'] = get_post_meta($post->ID, '_custom_example', true);
$form_fields['custom_example']['helps'] = __( 'A helpful text for this field.', FB_AAF_TEXTDOMAIN );
return $form_fields;
}
Feldinhalt speichern
Da wir nun die Datenfelder ergänzt haben, müssen wir uns nur noch um das Speichern der Werte kümmern. Auch dazu stellt WordPress einen Hook attachment_fields_to_save
bereit, so dass man in die Speicherfunktion nur einhaken muss.
// save custom field to post_meta
function fb_attachment_fields_save($post, $attachment) {
if ( isset($attachment['custom_example']) )
update_post_meta($post['ID'], '_custom_example', $attachment['custom_example']);
return $post;
}
Einhaken in WordPress
Die beiden Funktion, die im Vorfeld kurz erklärt wurden bringen und die nötigen Funktionen und nun integrieren wir sie in WordPress, wir hacken ein. Wer die Möglichkeit nicht so gut kennt, kurz die Erklärung anhand dieser beiden Filter-Hooks. In beiden Fällen übergeben unsere Funktionen zwei Parameter an die Hooks von WordPress und sie werden mit dem Standard-Wert der Priorität 10 übergeben. Alles wirkt auf einen Filter von WordPress und daher das einhaken auf den jeweiligen Filter-Hook (add_filter
) attachment_fields_to_*
. Die Übergabe via Array array(&$this;, ...
findet hier nur statt, da alles im Anschluss innerhalb einer Klasse verwendet wird.
add_filter( 'attachment_fields_to_edit', array(&$this;, 'fb_attachment_fields_edit'), 10, 2);
add_filter( 'attachment_fields_to_save', array(&$this;, 'fb_attachment_fields_save'), 10, 2);
Das Beispiel Plugin
Nun bauen wir die Funktionen und deren Hooks in ein Plugin und können so unkompliziert die Zusatzfunktionen innerhalb von WordPress verwendet werden. Die Trennung von Zusatzfunktionen in Theme und Plugin halte ich für sehr wichtig, da die Priorität der Integration unterschiedlich ist und da aus meiner Sicht Funktionserweiterungen im Theme nur dann sinnvoll sind, wenn sie eine reine Erweiterung des Theme darstellen und nicht der Funktionen von WordPress, unabhängig vom Frontend.
Ebenso ist die Nutzung via Klasse sinnvoll, da so der Namensraum wesentlich sauberer gepflegt wird und man mehr Übersicht im Code bekommt. Aber Artikel über die Vorteile der Objektorientierten Programmierung und zumindest der Klassennutzung gibt es genug.
<?php
/**
* @package Add Attachment Fields
* @author Frank Bültge
*/
/*
Plugin Name: Add Attachment Fields
Plugin URI: https://bueltge.de/
Text Domain: add_attachment_fields
Domain Path: /languages
Description: Example for add a custom field to an attachment in WordPress
Author: Frank Bültge
Version: 0.0.1
Author URI: https://bueltge.de/
Donate URI: https://bueltge.de/wunschliste/
License: GPL
Last change: 24.11.2010 10:21:19
*/
/**
License:
==============================================================================
Copyright 2009/2010 Frank Bueltge (email : frank@bueltge.de)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Requirements:
==============================================================================
This plugin requires WordPress >= 2.7 and tested with PHP Interpreter >= 5.2.9
*/
//avoid direct calls to this file, because now WP core and framework has been used
if ( !function_exists('add_action') ) {
header('Status: 403 Forbidden');
header('HTTP/1.1 403 Forbidden');
exit();
} elseif ( version_compare(phpversion(), '5.0.0', '<') ) {
$exit_msg = 'The plugin require PHP 5 or higher';
header('Status: 403 Forbidden');
header('HTTP/1.1 403 Forbidden');
exit($exit_msg);
}
if ( !class_exists('add_attachment_fields') ) {
//WordPress definitions
if ( !defined('WP_CONTENT_URL') )
define('WP_CONTENT_URL', get_option('siteurl') . '/wp-content');
if ( !defined('WP_CONTENT_DIR') )
define('WP_CONTENT_DIR', ABSPATH . 'wp-content');
if ( !defined('WP_PLUGIN_URL') )
define('WP_PLUGIN_URL', WP_CONTENT_URL.'/plugins');
if ( !defined('WP_PLUGIN_DIR') )
define('WP_PLUGIN_DIR', WP_CONTENT_DIR.'/plugins');
if ( !defined('PLUGINDIR') )
define( 'PLUGINDIR', 'wp-content/plugins' ); // Relative to ABSPATH. For back compat.
if ( !defined('WP_LANG_DIR') )
define('WP_LANG_DIR', WP_CONTENT_DIR . '/languages');
// plugin definitions
define( 'FB_AAF_BASENAME', plugin_basename(__FILE__) );
define( 'FB_AAF_BASEDIR', dirname( plugin_basename(__FILE__) ) );
define( 'FB_AAF_TEXTDOMAIN', 'add_attachment_fields' );
class add_attachment_fields {
function __construct() {
if ( !is_admin() )
return FALSE;
add_action( 'init', array(&$this, 'text_domain') );
add_filter( 'attachment_fields_to_edit', array(&$this, 'fb_attachment_fields_edit'), 10, 2);
add_filter( 'attachment_fields_to_save', array(&$this, 'fb_attachment_fields_save'), 10, 2);
}
function text_domain() {
load_plugin_textdomain( FB_AAF_TEXTDOMAIN, false, FB_AAF_BASEDIR . '/languages' );
}
// Add a custom field to an attachment in WordPress
function fb_attachment_fields_edit($form_fields, $post) {
$form_fields['custom_example']['label'] = __( 'Example Custom Field', FB_AAF_TEXTDOMAIN );
$form_fields['custom_example']['value'] = get_post_meta($post->ID, '_custom_example', true);
$form_fields['custom_example']['helps'] = __( 'A helpful text for this field.', FB_AAF_TEXTDOMAIN );
return $form_fields;
}
// save custom field to post_meta
function fb_attachment_fields_save($post, $attachment) {
if ( isset($attachment['custom_example']) )
update_post_meta($post['ID'], '_custom_example', $attachment['custom_example']);
return $post;
}
}
function add_attachment_fields_start() {
new add_attachment_fields();
}
add_action( 'plugins_loaded', 'add_attachment_fields_start' );
}
Ein Beispiel zum Auslesen der Werte in Example Frontend und Plugins
Nach dem nun ein Plugin entstanden ist, nun noch eine kleine Lösung um die Meta Daten des Attachments auszugeben. Aber dazu ist der schon angesprochenen Artikel zu empfehlen, da es dort weit aus mehr Hintergründe und Informationen gibt.
$attachments = get_children( array(
'post_parent' => get_the_ID(),
'post_type' => 'attachment',
'numberposts' => 1, // show all -1
'post_status' => 'inherit',
'post_mime_type' => 'image',
'order' => 'ASC',
'orderby' => 'menu_order ASC'
) );
foreach ( $attachments as $attachment_id => $attachment ) {
echo get_post_meta($attachment_id, '_custom_example', true);
}
Ein Praxisbeispiel – Fotograph und dessen URL – wurde neulich von Thomas Scholz auf WordPress Answers gepostet. Insofern also eine schöne Anwendung für diese Möglichkeit.