PHP Funktionen in WordPress debuggen

Wenn man ein Plugin oder Theme entwickelt, dann möchte man manchmal eine spezielle Funktion debuggen. Diese Funktion wird eventuell in einem größeren Kontext verwendet, was das Debuggen recht schwer und/oder langsam macht. Schauen wir uns hierzu das folgende Beispiel für eine Callback-Funktion eines Shortcode (oder „Server-Side-Rendered“ Blocks an):

function my_shortcode_callback( $atts ) {
	$atts = shortcode_atts( array(
		'post_id' => '',
		// ...
	), $atts, 'my_shortcode' );

	$result = my_function_to_debug( $atts );

	return sprintf(
		__( 'Posted on %1$s by %2$s', 'my-textdomain' ),
		date_i18n( get_option( 'date_format' ), $result['date'] ),
		get_the_author_meta( 'display_name', $result['author'] )
	);
}
add_shortcode( 'my_shortcode', 'my_shortcode_callback' );

In diesem Callback rufen wir die Funktion auf, die wir debuggen wollen. Diese Funktion kann sehr einfach, aber auch sehr komplex sein. Nehmen wir einfach einmal diese hier als Beispiel:

function my_function_to_debug( $atts ) {
	$post = get_post( (int) $atts['post_id'] );
	// Maybe do something with the post and create some result
	// ...

	// Dummy result: select two values from the post
	$result = [
		'date'   => $post->post_date,
		'author' => $post->post_author,
	];

	return $result;
}

Wenn man das auf den Weg würde man nun eine Seite oder einen Beitrag anlegen und dort den Shortcode einbinden, damit die Funktion, die wir debuggen wollen, aufgerufen wird. Nehmen wir mal an ihr wollt dabei den Aufruf der Funktion mit verschiedenen Parametern testen. Dann müsstet ihr mehrere Shortcodes in Seite oder Beitrag einfügen oder sogar mehrere Seiten/Beiträge anlegen.

Debuggen mit der WP-CLI

Eine Methode, sich ich in einem solchen Fall gerne verwende, ist die Nutzung der WP-CLI. Hier kann man beliebigen Code mit wp shell Befehl „in einer WordPress-Umgebung“ ausführen lassen. So könnte das aussehen:

$ wp shell
wp> my_function_to_debug( [ 'post_id' => 1 ] );
=> array(2) {
  ["date"]=>
  string(19) "2021-09-26 21:57:32"
  ["author"]=>
  string(1) "1"
}

Nach dem Starten der Shell rufen wir einfach die Funktion auf und übergeben direkt die passenden Argumente, die wir für unseren Test benötigen. Da die Funktion ein Array zurückgibt, erhalten wir ein Ergebnis in Form einer var_dump Visualisierung.

In gleicher Weise können wir natürlich auch die Callback-Funktion des Shortcodes selbst, aber auch jede andere Funktion eines Plugins/Themes oder des WordPress Core ausführen:

$ wp shell
wp> my_shortcode_callback( [ 'post_id' => 1 ] );
=> string(34) "Posted on 5 December 2021 by wapuu"

Der Vorteil des Debuggings mit dieser Technik ist, dass hierbei keine (Frontend) Seite gerendert werden muss. Es lädt stattdessen „nur“ die WordPress-Umgebung und führt die Funktion direkt aus. Das ist also sehr viel einfacher und schneller. Es muss eben auch keine Seite erstellt und der Shortcode darin eingefügt werden.

Debugging der Funktion mit einem AJAX Callback

Das einzige Problem an diesem Ansatz ist, dass es nicht (einfach) möglich ist, beim Debugging auch XDEBUG zu verwenden, da XDEBUG in der Regel nur in Verbindung mit einem HTTP-Request funktioniert. Ihr könntet zwar einen solchen Request mit curl auch in einem Terminal ausführen, aber dann müsstet ihr noch immer eine Seite oder einen Beitrag erstellen und dort den Shortode mit den Parametern einfügen. Stattdessen könnt ihr einen AJAX-Callback „missbrauchen“, um die Funktion in einem HTTP-Request auszuführen:

function my_ajax_callback() {
	$result = my_function_to_debug( [ 'post_id' => 1 ] );
	var_dump( $result );
}
add_action( 'wp_ajax_my_ajax_action', 'my_ajax_callback' );

Wenn ihr nun einen HTTP-Request auf die URL /wp-admin/admin-ajax.php?action=my_ajax_action macht (entweder im Browser oder im Terminal), dann erhaltet ihr die gleiche var_dump Ausgabe. Dieses Mal könnt ihr dann Breakpoint für XDEBUG für das Debugging setzen.

Fazit

Das Debugging von Funktionen benötigt nicht immer ein komplexes Anlegen von Seiten/Beiträgen, um die zu testende Funktion aufzurufen. Mit Hilfe der hervorragenden WP-CLI oder einem AJAX-Callback könnt ihr dies viel einfacher und schneller erledigen.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugin, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

1 Kommentar » Schreibe einen Kommentar

  1. Hallo Bernhard,

    wp shell war mir bisher tatsächlich nicht bekannt. Danke für den Tipp, behalte ich im Hinterkopf.

    Wenn man mehr herumbasteln will, ist vielleicht Tinkerwell (kostenpflichtig) auch noch ein guter Tipp. Funktioniert mit WordPress aber auch vielen anderen PHP-Frameworks. Kostenlos & Open Source gibt es auch noch Tinkerun https://github.com/tinkerun/tinkerun Funktioniert aber soweit ich weiß leider bisher nicht mit WordPress.

Schreibe einen Kommentar

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