Aufgabenstellung

Als Aufgabenstellung nutzen wir eine leicht modifizierte beinahe originale Kundenausschreibung auf einem Projekt-Börsen-Portal: Ein Kunde möchte gern, daß die Besucher bevor sie einen Kommentar abschicken können, den Kommentar in eine Kategorie einteilen, Kategorie 1 oder Kategorie 2. Wird Kategorie zwei ausgewählt, müssen noch zwei Ziffern eingegeben werden. Angezeigt werden sollen Kategorie 1 oder die Ziffern von Kategorie 2 über dem Kommentar (anpassbar über CSS). Bei Kategorie 2 soll zusätzlich ein vorhandener Shortcode für den Kommentar angewendet werden.

Die Funktionalität klingt nicht sehr exotisch, bei Shortcode mußte ich erst mal googeln, alles in allem wohl auch für ein WordPress-Greenhorn wie mich in ein paar Stunden machbar.

Los geht’s

Setup

  • Zuerst suchen wir uns ein schon verfügbares WordPress-Kommentar-Plugin, zum Beispiel das Plugin comment-rating-field-plugin, mit dem man einen Blog-Artikel bewerten und kommentieren kann
  • Wir wählen für unser Plugin den Plugin-Namen commentCategorizerPlugin. Als nächstes versuche ich den pluralis maiestatis abzulegen und installiere mir in meinem Eclipse die PHP Development Tools (PDT)
  • Ich lege unter wp-content/plugins den Ordner commentCategorizerPlugin an.
  • In Eclipse richte ich mein wordpress-Plugin ein.
    • File -> New PHP Project: Project Name: commentCategorizer
    • Create project at existing location, Directory: myWordpressHome/wp-content/plugins/commentCategorizerPlugin
    • Project -> Properties -> PHP Include Path -> Libraries -> Add External Source Folder: myWordpressHome/wp-includes

PHP

Nun legen wir unser Plugin-Haupt-PHP-File an: commentCategorizerPlugin.php. Und fügen erst mal die empfohlene Sicherheitszeile hinzu.

defined( ‚ABSPATH‘ ) or die( ‚No script kiddies please!‘ );

Weil wir unser Plugin nicht auf  https://wordpress.org/plugins/ hosten wollen, brauchen wir kein readme.txt anlegen und auch keine Homepage für das Plugin (auf der erklärt wird, wie das Plugin zu benutzen ist).

Um die Standard-Plugin-Information kommen wir nicht herum:

/**
* Plugin Name: CommentCategorizer
* Plugin URI: http://localhost/no_uri_given
* Description: Plugin allows to set a required comment category
* Version: 1.0.0
* Author: Heiko Helmbrecht
* Author URI: http://helmbrecht.it
* Text Domain: commentCategorizerDomain
* Domain Path: /locale/
* Network: false
* License: not necessary
*/

Wir erzeugen gleich mal leere Platzhalterfiles für CSS und JavaScript unseres Plugins und binden diese ein:

wp_enqueue_script('commentCategorizer-frontend', WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__)).'js/frontend.js', array('jquery'), '1.0.0', true);

wp_enqueue_style('commentCategorizer-css', WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__)).'css/commentCategorizer.css', array(), '1.0.0');

Die eigentliche Logik lagern wir aus in eine Klasse mit dem Namen CommentCategorizer.class.php mit den Klassenattributen categoryA, categoryB, shortCodeForCategoryB_Start, shortCodeForCategoryB_End.

require_once( plugin_dir_path( __FILE__ ) . 'CommentCategorizer.class.php' );
$commentCategorizer = new CommentCategorizer();

Das Geheimnis eines WordPress-Plugins scheint darin zu bestehen, die Plugin-Funktionalität an die richtigen Hooks zu setzen. In unserem Beispiel ist es nicht schwer, die nötigen Hooks zu finden, da beinahe alle bereits im Muster-Plugin comment-rating-field-plugin zu finden sind.

Anzeigen der Kategorie-Felder

 add_action ( 'comment_form_logged_in_after', array (
				&$this,
				'displayCategoryFields' 
		) ); 
add_action ( 'comment_form_after_fields', array (
				&$this,
				'displayCategoryFields' 
		) );


	function displayCategoryFields() {
		?>
<!-- CommentCategorizer Fields: Start -->
<p class="coca-field">
	<label for="mainCategory">Label Main Category</label> <select
		id="mainCategory" name="mainCategory">
		<option value=""></option>
		<option value="<?php echo $this->categoryA; ?>"><?php echo $this->categoryA; ?></option>
		<option value="<?php echo $this->categoryB; ?>"><?php echo $this->categoryB; ?></option>
	</select> <label id="subCategoryLabel" for="subCategory"
		style="display: none;">Specify <?php echo $this->categoryB; ?> as number between 10-99</label> <input
		id="subCategory" name="subCategory" size="2" style="display: none;" />

</p>
<!-- CommentCategorizer Fields: End -->
<?php
	}

Validieren und Speichern der Kategorie-Felder

add_action ( 'pre_comment_on_post', array (
				&$this,
				'validateCategories' 
		) );
add_action ( 'comment_post', array (
				&$this,
				'saveCategory' 
		) );
	/**
	 * Validates the mainCategory and subCategoryField
	 */
	function validateCategories() {
		if (empty ( $_POST ['mainCategory'] )) {
			wp_die ( __ ( 'Error: please select the mainCategory of your comment!' ) );
		}
		if ($_POST ['mainCategory'] == $this->categoryB) {
			if (empty ( $_POST ['subCategory'] ) || ! preg_match ( '/[0-9]{2}/', $_POST ['subCategory'] )) {
				wp_die ( __ ( 'Error: please specify the subCategory of your comment with two digits!' ) );
			}
		}
	}
	
	/**
	 * Saves mainCategory and subCategory
	 */
	function saveCategory($commentID) {
		add_comment_meta ( $commentID, 'commentCategorizerMain', $_POST ['mainCategory'], true );
		if ($_POST ['mainCategory'] == $this->categoryB) {
			add_comment_meta ( $commentID, 'commentCategorizerSub', $_POST ['subCategory'], true );
		}
	}

Anzeigen der abgespeicherten Kategorien am Kommentar

add_action ( 'comment_text', array (
				&$this,
				'displayCategory' 
		) );
add_Filter ( 'comment_text', 'do_shortcode' ); // wendet shortcodes and

	function displayCategory($comment) {
		global $post;
		$commentID = get_comment_ID ();
		$mainCategory = get_comment_meta ( $commentID, 'commentCategorizerMain', true );
		if ($mainCategory == $this->categoryB) {
			$subCategory = get_comment_meta ( $commentID, 'commentCategorizerSub', true );
			$comment = $this->shortCodeForCategoryB_Start . '<span class="subCategory">' . $subCategory . '</span><br />' . $comment . $this->shortCodeForCategoryB_End;
		} else if ($mainCategory == $this->categoryA) {
			$comment = '<span class="mainCategory">' . $this->categoryA . '</span><br />' . $comment;
		}
		return $comment;
	}

Konfigurationsmenu des Plugins

Der Text für Kategorie 1 und 2 sollte konfigurierbar sein, ebenso wie der gewünschte shortcode. Glücklicherweise gibt es für das Konfigurationsmenu einen Code-Generator. Der Code-Generator erzeugt den Code für die Hooks admin_menu und admin_init.

Das war’s

wordpress-plugin-demo

Ein kleines WordPress-Plugin zu schreiben ist also einfacher als gedacht. Projektbörsen wie Twago oder oDesk bieten unzählige WordPress-Aufträge, leider mit Preisvorstellungen, die sich am indischen Durchschnittseinkommen orientieren und hierzulande höchstens Studenten anlocken dürften.

Siehe auch:

Markiert in:                                    

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *