WordPress Plugins bereichern

Mit der kommenden Version von WordPress 2.7 verändert sich das Menu in die verticale, damit stehen dem Autor aber weitere Möglichkeiten offen, die schon in einigen Beiträgen Erwähnung fanden. In diesem Beitrag möchte ich aber Plugin-Autoren ansprechen und sie bitten, macht eure Plugins bedienerfreundlicher – nur zwei kleine Möglichkeiten möchte ich zeigen; diese zeigen aber, in welchem Detail es liegen kann. Die Möglichkeiten wurden schon mehrfach in der WP-Hacker-Mailing-List besprochen und so gut wie alle sehen es als Mehrwert.

Mit der kommenden Version von WordPress 2.7 verändert sich das Menu in die verticale, damit stehen dem Autor aber weitere Möglichkeiten offen, die schon in einigen Beiträgen Erwähnung fanden. In diesem Beitrag möchte ich aber Plugin-Autoren ansprechen und sie bitten, macht eure Plugins bedienerfreundlicher – nur zwei kleine Möglichkeiten möchte ich zeigen; diese zeigen aber, in welchem Detail es liegen kann. Die Möglichkeiten wurden schon mehrfach in der WP-Hacker-Mailing-List besprochen und so gut wie alle sehen es als Mehrwert.

Icon im Menu

Icon im Menu
Im ersten Fall möchte ich zeigen, wie man das Menu um ein Icon erweitern kann. Dies kann zu Mehrwert im Sinne von Übersichtlichkeit führen bzw. ist es auch ein Hingucker für die Nutzer, der Menu-Link ist augenscheinlicher. Ich verwende zum Einbau des kleinen Icon nicht den Verweis auf die Datei, sondern lege das Icon base64-codiert im Code des Plugins ab. Das sparrt eine Datei, geschweige denn einen Ordner und den Zugriff, so dass ein request gespart wird.

Um eine Datei in den Code zu wandeln, habe ich einen kleinen Service eingerichtet, wer sich also nichts selber bauen will, kann diesen gern nutzen – Image2Base64 Generator.

Das Icon wird nur ab Version 2.7 von WordPress integriert, dass prüfe ich mit einer einfachen Abfrage der Version. Weitere Infos habe ich am Code hinterlegt.


/**
 * Images/ Icons in base64-encoding
 * @use function fb_sayfa_sayac_get_resource_url() for display
 */
if( isset($_GET['resource']) && !empty($_GET['resource'])) {
	# base64 encoding
	$resources = array(
		'ssprc.gif' =>
		'R0lGODlhCwALAKIEANTU1Kurq/b29pSUlP///wAAAAAAAAAAAC'.
		'H5BAEAAAQALAAAAAALAAsAAAMlSKoRMysGIZ50A1RJ3ybNow3f'.
		'VJGoQo4nRJDdpwqjtcDy/dhLAgA7'.
		'');
	
	if(array_key_exists($_GET['resource'], $resources)) {

		$content = base64_decode($resources[ $_GET['resource'] ]);

		$lastMod = filemtime(__FILE__);
		$client = ( isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false );
		// Checking if the client is validating his cache and if it is current.
		if (isset($client) && (strtotime($client) == $lastMod)) {
			// Client's cache IS current, so we just respond '304 Not Modified'.
			header('Last-Modified: '.gmdate('D, d M Y H:i:s', $lastMod).' GMT', true, 304);
			exit;
		} else {
			// Image not cached or cache outdated, we respond '200 OK' and output the image.
			header('Last-Modified: '.gmdate('D, d M Y H:i:s', $lastMod).' GMT', true, 200);
			header('Content-Length: '.strlen($content));
			header('Content-Type: image/' . substr(strrchr($_GET['resource'], '.'), 1) );
			echo $content;
			exit;
		}
	}
}


/**
 * Display Images/ Icons in base64-encoding
 * @return $resourceID
 */
function fb_sayfa_sayac_get_resource_url($resourceID) {
	
	return trailingslashit( get_bloginfo('url') ) . '?resource=' . $resourceID;
}


/**
 * add menu in backend
 */
function fb_sayfa_sayac_add_menu() {
	global $wp_version;
	if ( current_user_can('edit_posts') && function_exists('add_submenu_page') ) {

		$menutitle = '';
		if ( version_compare( $wp_version, '2.6.999', '>' ) ) {
			$menutitle = '<img src="' . wpag_get_resource_url('ssprc.gif') . '" alt="" />' . ' ';
		}
		$menutitle .= __('Post Read Counter', 'sayfasayacprc');
		
		add_submenu_page('index.php', __('Sayfa Sayac - Post Read Counter', 'sayfasayacprc'), $menutitle, 9, __FILE__, 'fb_sayfa_sayac_statistic');
		$plugin = plugin_basename(__FILE__); 
		add_filter( 'plugin_action_links_' . $plugin, 'fb_sayfa_sayac_plugin_actions' );
	}
}

Den img-Tag erweitere ich um ein Leerzeichen, damit es nicht direkt am Menutext klebt. Man könnte das auch über eine CSS-Definition machen, aber das wäre dann in den meisten Fällen wohl ein Inline-Style. Dieser bringt unnötig Code, eine Unsauberkeit und schlechtere Performance in das Backend. Bei den Entwicklern von WordPress habe ich das schon länger angesprochen, eventuell bekommen wir die CSS-Definition noch im Styte zu 2.7.

Settings Link

Absprung im Plugin-Bereich

den obigen Code genauer angeschaut hat, der wird schon den Zugriff auf den Filter plugin_action_links bemerkt haben. Diese nutze ich um auf der Plugin-Seite einen Absprung einzuhängen. Dieser erleichtert den Absprung in die Einstellungen oder den Datenbereich, wie hier im Beispiel. Ich denke, dass man damit dem Nutzer die Benutzung vereinfacht - kein Suchen, wo befindet sich nun der Bereich. Der Screenshot zeigt es schon, dass ich bei meinen Plugins immer den Settings-Link links der beiden Standard-Links Deaktivieren und Bearbeiten, wenn die Rechte der Datei das zulassen, integriere.


/**
 * Adds an action link to the plugins page
 */
function fb_sayfa_sayac_plugin_actions($links) {

	$settings_link = '<a href="sayfa_sayac_de.php">' . __('Settings') . '</a>';
	array_unshift( $links, $settings_link );

	return $links;
}

Die obigen Funktion läuft nur ab WordPress 2.7 und wurde von Latz näher vorgestellt! Möchte man abwärts kompatibel sein, dann geht es etwas umständlicher.


/**
 * Adds an action link to the plugins page
 */
function fb_sayfa_sayac_plugin_actions($links, $file){
	static $this_plugin;

	if( !$this_plugin ) $this_plugin = plugin_basename(__FILE__);

	if( $file == $this_plugin ){
		$settings_link = '<a href="index.php?page=sayfa_sayac/sayfa_sayac_de.php">' . __('Settings') . '</a>';
		$links = array_merge( array($settings_link), $links); // before other links
	}
	return $links;
}

Nutzt man diese etwas unübersichtliche Form, dann muss der Filter anders eingebunden werden, in meinem Beispiel in der Funktion fb_sayfa_sayac_add_menu() ist zu tauschen


$plugin = plugin_basename(__FILE__); 
add_filter( 'plugin_action_links_' . $plugin, 'fb_sayfa_sayac_plugin_actions' );

in


add_filter( 'plugin_action_links', 'fb_sayfa_sayac_plugin_actions', 10, 2 );

Aktivieren der beiden Hooks

Über den Hook admin_menu aktivere ich die beiden anderen Hooks. Im Vorfeld frage ich aber ab, ob man sich auch im Admin befindet, so dass nur dann der Code Beachtung findet.


/* Register WordPress hooks */
if ( is_admin() ) {
	add_action('admin_menu', 'fb_sayfa_sayac_add_menu');
}

Ich denke, dass die diese beiden Möglichkeiten einen Mehrwert darstellen und schon eine ganze Reihe von Plugins haben diese Funktion, andere werden in naher Zukunft ein Update bekommen. Vielen Nutzer bestätigen mir das und mögen vor allem den schnellen Absprung im Plugin-Bereich. Ideen, Lob und Kritiken – wie immer steht die Kommentarfunktion offen und freut sich über Meinungen.

Comments are closed.