WordPress: Meine häufig genutzten Funktionen, Klassen, Styles

Was ist HTML Code

Ich werkele nicht täglich im WordPress Quellcode herum oder versuche Plugins zu programmieren. Dementsprechend gerät einmal angelerntes ohne wiederholte Nutzung schnell wieder ins Vergessen. Zumindest ergeht es mir so, weshalb ich aus Eigennutz in diesem Beitrag Funktionen aufliste, die ich mindestens einmal nutzte.

Inspiriert von: revilodesign.de | get_posts |

Datenbank-Abfrage mit WordPress Klasse wpdb

Ein Überblick zu allen Funktionen der wpdb-Klasse ist HIER aufgeführt.

Wenn eine WordPress-Tabelle gelesen werden soll, ist der sogenannte Prefix wichtig. Es ist der kleine Textzusatz unmittelbar vor dem Tabellennamen. Ermittelt wird er mit „$wpdb->prefix“.

Fehlerkontrolle: Prüfen, ob Datenbankabfrage funktioniert

Der folgende Code sagt Dir, ob der Zugriff auf Deine Datenbank erfolgreich ober fehlerhaft war.

$result = $wpdb->insert( $table, array("name"  => $name, "email" => $email));
if($result){
	// Erfolg
}else{
  	// Fehler
}

Wenn Du Genaueres über Fehler in der Abfrage wissen willst, nutzt Du die folgende Ausgabe.

echo $wpdb->last_error; // Fehler (zB. Column 'ArtID' cannot be null)
echo $wpdb->last_query; // fehlerhafter query (zB. INSERT INTO `besucher` (`ip`, `seite`, `browser`, ...)

SELECT: Daten suchen in einer Tabelle

In diesem Beispiel werden aus der WordPress-Tabelle „posts“ alle publizierten Beiträge (posts) aufgelistet.


$wpdb->get_results: Mehrere Zeile auslesen

Mit $wpdb->get_results() werden alle Zeilen gefunden und ausgegeben, oder die einer bestimmten Bedingung (where) entsprechen.

global $wpdb;
$Daten = $wpdb->get_results("SELECT *  FROM ".$wpdb->prefix."posts WHERE post_status = 'publish' AND post_type = 'post'");

if(!empty($Daten)){ // DATEN WURDEN GEFUNDEN
    foreach ( $Daten as $Daten_Satz ) {
        echo '<br>'.$Daten_Satz->post_title;
    }
}else{ // KEINE DATEN WURDEN GEFUNDEN
    echo 'Keine Treffer gefunden!';
}

$wpdb->get_row: Einzelne Zeile auslesen

Mit $wpdb->get_row() wird eine einzelne Zeile abgerufen. Gibt es mehrere Zeilen, wird nur die erste ausgeben.

$daten = $wpdb->get_row("SELECT *FROM ".TABLE_SETTINGS." WHERE id = 1");

define("GEO_LOCATION", 	$daten->GEO_LOCATION); 
define("RELOAD_SPERRE",	$daten->RELOAD_SEKUNDEN); 
define("RELOAD_AKTIV",	$daten->RELOAD_AKTIV);

TABLE_SETTINGS liegt als Konstante vor.

$wpdb->num_rows: Treffer zählen

Die Funktion $wpdb->num_rows() gibt die Anzahl der gefundenen Treffer zurück, muss aber direkt nach dem Aufruf „$wpdb->get_results()“ erfolgen.

$Daten = $wpdb-> get_results("SELECT * FROM ".TABLE_RELOAD." WHERE ip='$ip' AND seite='$Seite'");
$visit = $wpdb->num_rows;

$wpdb->get_var: einzelnen Wert abrufen

Mit get_var() kann ein einzelner Wert einer Datenbankabfrage abgerufen werden. Angenommen, Du hast die Spalten „view“ und „view_min“. Du möchtest nicht nur wissen, wie hoch die Differenz der beiden Spalten in Zeile X oder Y ist, sondern Du möchtest die Differenzen aller Zeilen ermitteln. Dazu nutzt du die Funktion sum().

$Ergebnis = $wpdb->get_var("SELECT SUM(view_min - view) AS differenz FROM meine_Tabelle ");
echo "<br>Summe Differenzen: ".$Ergebnis";

In der Ausgabe ist zu sehen:

Summe Differenzen: 9857

Die Funktion würde auch mit get_results() funktionieren, aber dann sähe das Ergebnis so aus:

Array
(
    [0] => stdClass Object
        (
            [differenz] => -29999
        )
)

Die Differenz steckt schon irgendwo in dem Ergebnis drin, aber „übersichtlich“ sieht anders aus. In Fällen, bei denen nur ein Ergebnis abgefragt werden soll, nimmt man die Funktion get_var().

$wpdb->UPDATE: Felder einer Zeile aktualisieren

Es ist übersichtlicher und vereinfacht eine mögliche Fehlersuche, wenn die einzelnen Argumente in Arrays verpackt werden. Für das Format gibt es nur drei Möglichkeiten: %s steht für String (Text), %d für Integer (ganze Zahlen) und %f für Float (Gleitkommazahlen).

$data 	= array(
	'ip' 	=> $ip,
	'datum' => $heute,
	'view' 	=> $daten[0]->view+1
	);

$format = array(
	'%s',
	'%s',
	'%d'
	) ;

$where 	=  array('seite' => $Seite);

$result = $wpdb->update(TABLE_ARTIKEL, $data, $where, $format);

Inhalte einer Spalte löschen

Der folgende Code löscht in Tabelle “comments” die Spalte “comment_author_IP” durch Überschreiben der Felder mit einem leerem String (Inhalt).

// Inhalt einer Tabellenspalte löschen
$wpdb->query('UPDATE ' . $wpdb->prefix . 'comments SET comment_author_IP = "";');

Achtung: Die PHP-Datei müssen im Format “UTF 8 ohne BOM” abgespeichert werden. „BOM“ ist die Abkürzung für „byte-order mark“.

$wpdb->INSERT: Neue Zeile in Tabelle eintragen

Wenn in eine WordPress-Tabelle etwas geschrieben oder verändert werden soll, ist der oben erwähnte Prefix zu beachten.

$data 	= array(
    'ip' 		=> $ip,
    'seite' 	=> $Seite,
    'datum' 	=> $heute
    );

$format = array(
    '%s',
    '%s',
    '%s'	
    );

$wpdb->insert(TABLE_ARTIKEL,$data,$format);

$wpdb->DELETE: Datensätze löschen

Manchmal sind Datensätze in einer Tabelle zu löschen.


$where 	=  array('timestamp' < $timestamp_alt);

$format = array( '%d' );

$wpdb->delete(TABLE_RELOAD, $where, $format);  

$wpdb->PREPARE: Datenbank vor SQL-Injektion schützen

Natürlich kann man im WordPress-Framework sämtliche SQL-Befehle nutzen, die MySQL unterstützt. Du kannst es über die $wpdb->query Funktion machen. Besser ist es, wenn du die Abfrage mittels „Prepared Statements“ vorbereitest, um sie beispielsweise gegen die allseits bekannte SQL-Injection abzusichern.
Durch das Vorbereiten der Statements mittels der prepare-Methode werden die Daten durch mehrere Schichten verarbeitet, was es Angreifern erschwert, schädlichen Code einzuschleusen.

global $wpdb;
 
$wpdb->query( 
	$wpdb->prepare( 
		"
    DELETE FROM 'table'  
		 WHERE ID = %d
		  AND titel = %s
		",
	  13, 'Gehacktes' 
  ) 
);

Eine einfache UPDATE-Anweisung mit wpdb und prepare:

$result = $wpdb->query($wpdb->prepare("UPDATE tabelle_x  SET view = xyz WHERE view_min < view"));

–> Gute Erklärung


Funktionen & Snippets

Beiträge einer/ aller Kategorien auflisten

Der folgende Code listet 10 Beiträge aus der Kategorie „Lexikon“ mit Titel und Inhalt auf. Es wird die Klasse „WP_Query“ verwendet.

$my_query = new WP_Query('category_name=Lexikon&showposts=10'); 

while ($my_query->have_posts()) : $my_query->the_post(); 
	the_title(); 
	the_content();
endwhile;


Beiträge auflisten mit spezifischen Angaben

Dieser Code erledigt Ähnliches. Aus der Kategorie „Lexikon“ werden 10 Beiträge geholt. Genutzt wird die Funktion get_posts($args). Ausgegeben werden in diesem Beispiel:

  • Titel: $post->post_title
  • URL des Thumbnail: get_the_post_thumbnail_url($post->ID, ‚full‘)
  • Link zum Artikel: get_permalink($post->ID)

//Parameter für Posts
$args = array(
    'category_name' => 'Lexikon',
    'numberposts' => 10
);

//Posts holen
$posts = get_posts($args);

//Inhalte sammeln
$content = "";
foreach ($posts as $post) {
    $content .= "Titel: ".$post->post_title."<br/>";
    $content .= "Bild URL: ".get_the_post_thumbnail_url($post->ID, 'full')."<br/>";
    $content .= "Link: ".get_permalink($post->ID)."<br/>";
    $content .= "<br/><br/>";
}

Zeichen im Post zählen

Ich möchte ermitteln, wie viele Zeichen ein Beitrag enthält. Ohne ein fremdes Plugin zu installieren. Zunächst suchte ich nach einer WP-Tabelle, die eventuell Informationen darüber enthält. Schließlich zeigt mit der Gutenberg-Editor ja auch an, wie viele Zeichen mein Post belegt. Aber da wurde ich nicht fündig. Möglicherweise übersah ich etwas.

Eine Google-Suche nach „wordpress function count post char“ brachte wenigstens einen Ansatz. WordPress kennt die Funktion „wp_strip_all_tags($post->post_content)“. Sie bereinigt die Variable post_content um nichtdruckbare Zeichen und zählt die lesbaren Zeichen (inkl. Leerzeichen).

Diese Funktion liefert ähnliche Ergebnisse wie der Gutenberg-Editor, weshalb ich sie vorerst nutze.

Dank dieser Funktion kann ich nun gezielt alle Artikel auflisten, die

  • vom Typ „Beitrag“ sind und
  • veröffentlicht wurden und
  • mindestens XYZ Zeichen auf die Waage bringen.

Die Funktion strip_shortcodes() soll zusätzlich Short-Codes heraus fischen.

$count_char = strlen(wp_strip_all_tags(strip_shortcodes($post->post_content)));

Tags eines Posts auflisten

Wenn Du alle Tags, Schlagwörter eines Beitrages ermitteln willst, nutzt Du die Funktion

$post_tags = get_the_terms( $post_id, 'post_tag' );
echo "<pre>";print_r($post_tags);echo "</pre>";

Wenn du das Array ausgibst, erhältst Du folgende Daten:

Array
(
    [0] => WP_Term Object
        (
            [term_id] => 61
            [name] => Computer
            [slug] => computer
            [term_group] => 0
            [term_taxonomy_id] => 61
            [taxonomy] => post_tag
            [description] => 
            [parent] => 0
            [count] => 9
            [filter] => raw
        )

    [1] => WP_Term Object
        (
            [term_id] => 70
            [name] => Datenrettung
            [slug] => datenrettung
            [term_group] => 0
            [term_taxonomy_id] => 70
            [taxonomy] => post_tag
            [description] => 
            [parent] => 0
            [count] => 5
            [filter] => raw
        )

)

Wenn die Tags (Schlüsselwörter) in einem String aufgelistet werden sollen, nutzt du am besten eine foreach-Schleife.

if ($post_tags) {
	foreach( $post_tags as $tag ) {
		$tag_liste .= $tag->slug.", ";
    }
}

$tag_liste = rtrim($tag_liste, ", ");	// ENTFERNT das letze Komme und Leerzeichen!	
echo $tag_liste;

Die Tags stehen als Slug in einem String.

suchmaschinenoptimierung-seo, website

Möchtest Du sprechende Tags haben, musst Du statt $tag->slug den Namen wählen: $tag->name.

Suchmaschinenoptimierung SEO, Website

Plugins manuell im Code aktivieren & deaktivieren

Du bist ein „Wochenend-Programmierer“ wie ich und traust Dich raus in die Tiefen Deiner WordPress-Installation? Ich schreibe derzeit ein kleines Plugin, das mir spezielle administrative Aufgaben abnimmt. Eine dieser Aufgaben ist – Erkenne, ob ein Caching-Plugin (WP Rocket) aktiv ist und deaktiviere es in bestimmten WordPress-Beiträgen.

Klar, WP Rocket ist „mächtig“ und bedarf keiner externen „Sonderbehandlung“ – aber der Klapperstorch liefert mir ja auch nicht mein Wunsch-Baby auf den Balkon zu meiner Wunschzeit. Wie dem auch sei: Ich möchte ein bestimmtes WordPress-Plugin per PHP-Code deaktivieren und auch wieder aktivieren.

Wie erfahre/ermittele ich mit PHP, ob ein Plugin installiert wurde?

Bevor ein Plugin deaktiviert wird, wäre es schön zu wissen, ob es überhaupt in WordPress installiert wurde.

Das geschieht mit der Funktion array_key_exists($plugin, get_plugins() )

$plugin 		= "wp-rocket/wp-rocket.php"; // Pfad des Plugin

if(array_key_exists($plugin, get_plugins() ) ){ 	// Plugin installiert?
		$meldung = "<h2>".$plugin." installiert.";
}else{
	$meldung = "<h2><b>".$plugin."</b> NICHT installiert.</h2>";
}

Wie erfahre/ermittele ich mit PHP, ob ein Plugin aktiv ist?

Jetzt muss natürlich herausgefunden werden, ob ein bestimmtes, installiertes Plugin aktiviert ist. Die dazugehörige Funktion ist „is_plugin_active(‚wp-rocket/wp-rocket.php‘))“

In meinem Beispiel soll geschaut werden, ob das Plugin WP-Rocket aktiv ist.

if (is_plugin_active('wp-rocket/wp-rocket.php')) {
	echo "<hr>WP Rocket aktiv!<hr>";
}

In der Klammer trägst Du den Pfad und den Namen der PHP-Datei des betreffenden Plugins ein. Natürlich den Pfad ausgehend vom Plugin-Verzerichnis. Innerhalb der Abfrage kannst Du dann beliebigen Code einfügen, ausführen.

Wie deaktiviere ich ein WordPress-Plugin manuell im PHP-Code?

Die nützliche Funktion zum Deaktivieren von aktiven Wirdpress-Plugins nennt sich „deactivate_plugins“.

Zuerst legen wird den Pfad und den Dateinamen des gesuchten Plugins in eine Variable ab. In der Variabel darf kein „/“ am Anfang stehen, das führt unweigerlich zu einem Fehler.

  • Abfrage 1: Wurde das Plugin installiert?
  • Abfrage 2: Ist das Plugin aktiviert?

// Pfad des gewünschten Plugin
$plugin 	= "wp-rocket/wp-rocket.php";
$meldung 	= ""; 					

if(array_key_exists($plugin, get_plugins() )){ 	// Plugin installiert?
	if(is_plugin_active($plugin)) { 			// Plugin aktiviert?
		$meldung = "<h2>".$plugin." installiert und aktiv.";
		deactivate_plugins($plugin, true); 		// Plugin deaktivieren
	}else{
		$meldung = "<h2><b>".$plugin."</b> ist installiert, aber nicht aktiviert</h2>";
	}
}else{
	$meldung = "<h2><b>".$plugin."</b> ist NICHT installiert und NICHT aktiv.</h2>";
}

Styles

Im Customizer kannst Du verschiedene Style „deaktivieren“, ohne im Quellcode des Themes herumzupfuschen. Die #Namen der verwendeten Styles findest Du schnell mit dem Seiteninspektor im Browser heraus.

firefox 2022 03 12 12 45 18

Klick im Browser auf die Funktionstaste F12 , wähle im Inspektor den Reiter „Inspektor“, klick links daneben auf das Pfeil-Symbol und wähle den Bereich, den du untersuchen möchtest. Im schwarzen Rechteck wird die dazugehörige Klasse angezeigt und unten der dazugehörige Quellcode abgebildet.

Beispiele

Rahmen um Beitragsbild-Thumb auf Archiv-Seiten

.mh-posts-list-thumb img {border: 2px solid silver;}

Platzhalter-Bild entfernen

Nicht zu jedem Beitrag ist stets ein passendes Beitrags-Bild zur Hand. WordPress stellt für diesen Fall ein Platzhalter-Bild zur Verfügung. Dieses lässt sich auf Archivseiten und der Startseite mit folgendem Code ausblenden.

.mh-image-placeholder { display: none; }

Kategorien Name aus Thumb entfernen

Bei einigen Themes wird der Name der Kategorie im Thumb des Beitragsbild fixiert. Der folgende Code entfernt diese Notiz.

.mh-image-caption { display: none; }<br>.mh-posts-list-caption { display: none; }

Meta-Angaben unter Titel ausblenden

Der folgende Code entfernt den gesamten Meta-Block unter dem Beitragstitel.

 .mh-meta { display: none; }

Wo Styles einbauen?

Die zusätzlichen CSS-Styles baust Du mit dem Customizer ein.

firefox 2022 03 12 14 06 37