Artikel & Guides

WordPress Snippet – Random Post Shortcode

letzte Änderung: 9. Juli 2022

Heute zeige ich dir ein kleines WordPress Snippet, mit dem du zum Beispiel auf deiner Startseite, random – also zufällig – 3 Beiträge anzeigen lassen kannst. Das Besondere dabei: Die Auswahl wird 24 Stunden gleich bleiben und sich erst am nächsten Tag wieder ändern! Es ist also ein daily random shortcode 😉

ACHTUNG! Bitte lesen!
Du benutzt das hier Gezeigte natürlich, wie immer, auf eigenes Risiko!
Ich habe alles selbst durchgeführt und mir mein System nicht zerschossen oder sonst irgendwelche negativen Auffälligkeiten bemerkt.
Aber dennoch… Backups sind immer gut….
Ich übernehme keine Haftung für irgendwelche Schäden am System, der Hardware oder der Katze….

WordPress Snippet – Random Post Shortcode – Erklärung

Ganz einfach ausgedrückt erzeugen wir ein eigenen Shortcode, der alle deine veröffentlichen Artikel durchwühlt und sich zufällig 3 rauspicken wird. Diese werden dann als Vorschau ausgegeben.
Dabei prüft das Snippet ob dies schon in einem bestimmten Intervall geschehen ist (hier 24 Stunden).

Innerhalb dieses Zeitfensters wird die Ausgabe gespeichert und bei jedem Aufruf der Seite erneut angezeigt. Erst nach dem Ablauf startet die Random-Funktion erneut. Es arbeitet also ähnlich wie ein Cache.

Was brauchen wir ?

Eigentlich nicht viel, da wir alles selbst erstellen werden. Du kannst dieses Snippet in einem Child-Theme erstellen oder du nutzt das PlugIn CodeSnippets*(empfohlen) dazu.

PlugIn CodeSnippets

Ich werde mich hier auf das PlugIn CodeSnippets* beziehen. Da ich dieses schon seit langem verwende und dieses gerade für solche kleineren Code-Schnipsel perfekt geeignet ist.

Es gibt es in der kostenlosen „Free“ Version: CodeSnippets Free*
Und seit kurzem auch endlich in einer „Pro“ Version: CodeSnippets Pro*
Ein paar Worte mehr zu CodeSnippets findest du bei den genialsten WordPress PlugIns

dwc_post_modified_date (OPTIONAL)

Weiterhin benötigst du – allerdings optional – noch ein zweiten Snippet.
Sofern du von deinen Artikeln das letzte Änderungsdatum anzeigen lassen möchtest.
Ich verwende diese Funktion in mehreren anderen Snippets. Daher lasse ich dies auch hier „getrennt“.

Allerdings kannst du dieses auch weglassen. Im Sourcecode von unserem Random Post Shortcode werde ich die Zeile entsprechend kennzeichnen, die du dann einfach weglassen bzw. aus kommentieren müsstest.

function dwc_post_modified_date($args) {
    $mod_date = get_the_modified_date($format=get_option( 'date_format' ),$args);
    if ( get_the_date($format=get_option( 'date_format' ),$args) !== $mod_date ) {
		return 'letzte Änderung: ' . $mod_date ;
    }
	else
	 {
	return 'Erstellt am: ' . get_the_date($format=get_option( 'date_format' ),$args);
	}
}
add_shortcode( 'modified_date', 'dwc_post_modified_date' );

Random Post Shortcode

<?php
function dwc_random_post_shortcode() {
	// Cache/transient bereits vorhanden (liefert true oder false)
	$dwc_random_post = get_transient( 'dwc_random_post' ); 

	// wurde kein cache/transient angelegt, dann führe die query aus
	if ( $dwc_random_post === false ) {

		// Argumente für deine Artikel, die random angezeigt werden sollen.
		// Hier alle mit type "post" - also Beiträge
		// die veröffentlicht "publish" wurden
		// maximal 3 zufällig anzeigen 'rand'
		// BITTE Beschreibung zu dem "tax_query" Array auf darkwolfcave.de lesen! Die Kategorie (hier 106) muss bei dir sicher angepasst werden

		$args = array(
			'post_type' => array( 'post' ),
			'post_status' => 'publish',
			'posts_per_page' => 3,
			'orderby'=>'rand',
			'tax_query'=> array(
				array(
					'taxonomy' => 'category',
					'terms' => '106',  //Kategorie 106 (news) ausschließen
					'operator' => 'NOT IN'
				)
			)

		);

		// Abrufen der Artikel
		$dwc_random_post = get_posts($args);

		// Neuen Cache/transient anlegen, der 24 Stunden gültig ist
		set_transient( 'dwc_random_post', $dwc_random_post, 24 * HOUR_IN_SECONDS );
	}
	//initialisieren der Variablen/arrays
	unset($inhalt);
	$dwc_ids = array();

	//bauen unseres Loops, damit wir auch die Artikel sehen werden
	$inhalt = '<div>';

	foreach ($dwc_random_post as $post)
	{
		//falls die random-Suche mehrmals denselben Post ausspuckt wollen wir den Artikel dennoch nur einmal sehen
		$postid = $post->ID;

		if (in_array($postid,$dwc_ids))

		{
			continue;
		}
		else {
			//die "su- " klassen stammen von einem plugin "ShortcodeUltimate". Hier müsstest du die Klassen an deine
			// eigenen anpassen oder weglassen. Beispiel:  <div> <h2> 
			$inhalt .= '<div class="su-posts su-posts-default-loop">';
			$inhalt .= '<h2 class="su-post-title"><a href="'.get_permalink($post->ID).'">'.$post->post_title.'</h2></a>';

			//folgende Zeile NICHT mit einbauen wenn du "dwc_post_modified_date" nicht auch als Snippet benutzt!
			$inhalt .= '<div class="su-post-meta">'.dwc_post_modified_date($post->ID).'</div>';
			//Zeile drüber und Kommentar beachten!

			$inhalt .= '<p>'.get_the_excerpt($post->ID).'</p><br/>';
			$inhalt .= '<br/><br/></div>';

			array_push($dwc_ids,$postid);
			
		}
	}

	$inhalt.= '</div>';
	// Einmal resetten bitte und den Wert aus unserem inhalt-Array zurückgeben
	wp_reset_postdata();
	return $inhalt;
}
//der shortcode, welcher dann auch was anzeigen lässt
add_shortcode( 'random_post', 'dwc_random_post_shortcode' );

Wie erstelle ich ein neuen CodeSnippet?

Nachdem du CodeSnippets installiert und aktiviert hast, findest du im Admin-Bereich in der Menüleiste den Punkt snippets -> neu hinzufügen

neuen WordPress Snippet erstellen

Hier trägst du einfach den Namen (beliebig, aber sollte schon etwas aussagen) und den PHP-Code ein.
Jedes Snippet nur eine Box 😉

Also für die beiden oben genannten „dwc_post_modified_date“ und „Random Post Shortcode“ erstellst du jeweils ein eigenes Snippet.

Wie bekomme ich jetzt den Shortcode auf meine Seite?

Wie auch bei jedem anderen Shortcode. Du erstellst oder editierst deine Seite wo du die Random-Artikel sehen willst und fügst ein Shortcode ein. Z.B. im Gutenberg-Editor über „+“ und Shortcode.
Der Name für unseren lautet dann [random_post]. Das war es auch schon.
Achso… speichern/aktualisieren natürlich noch.

Genauere Beschreibung / Erklärung des Snippets Random Post Shortcode

Ich werde mit dir heute nicht alles Zeile für Zeile durchgehen, da dies hier wohl nicht zwingend notwendig ist. Du darfst dich aber natürlich wie immer bei mir melden, solltest du Fragen dazu haben oder du bei einem Fehler Hilfe benötigst.

Damit unsere Random Post sich nicht jedes mal beim neu laden der Seite ändert, müssen wir unser Ergebnis eine Zeitlang speichern. Dies erreichen wir mit „Transients“ – über den Aufruf get_transient.

Mit der Zeile $dwc_random_post = get_transient( 'dwc_random_post' ); fragen wir ab, ob schon ein transient mit dem Namen „dwc_random_post“ vorhanden ist. Falls nicht, erhalten wir ein false zurück, ansonsten ein true.

In der IF-Abfrage prüfen wir entsprechend. Und nur wenn ein false zurückgemeldet wurde, starten wir eine neue Query um unsere Random Posts zu erhalten.

Dafür legen wir in Zeile 13-26 ein entsprechendes Array mit Werten an.

'post_type' => array( 'post' ), // nur Artikel anzeigen (post)
'post_status' => 'publish', // nur welche die veröffentlicht sind (publish)
'posts_per_page' => 3, // maximal 3 Artikel (feel free...)
'orderby'=>'rand', //sortiere zufällig (rand)

Jetzt bitte aufpassen 😉
Mit dem folgenden array schließe ich bei mir eine ganze Kategorie aus. Denn aus dieser möchte ich KEINE Artikel zufällig haben. In meinem Fall ist das die Kategorie mit Namen „news“ und der tag_ID 106.
Du kannst die tag_ID herausfinden, indem du im Admin-Bereich zu „Beiträge“->“Kategorien“ gehst, dort bei der entsprechenden Kategorie mit der Maus drüber fährst, und dann unten links aus dem Link die Tag_ID ausließt:

tag_id wordpress snippets

Daher wirst du bei dir dieses hier anpassen, ganz herausnehmen oder einfach drin lassen müssen.
Solltest du es nicht ändern, und keine „106“ Kategorie haben, passiert auch nichts weiter.
Falls bei dir aber „106“ die Kategorie ist, unter der bei dir alle wichtigen Artikel erscheinen, solltest du sie dringend hier ändern…. sonst wirst du nicht viel sehen.

'tax_query'=> array(
array(
'taxonomy' => 'category',
'terms' => '106', //Kategorie 106 (news) ausschließen
'operator' => 'NOT IN'

In Zeile 32 legen wir dann den transient an um unser Ergebnis für 24 Stunden zu speichern:
set_transient( 'dwc_random_post', $dwc_random_post, 24 * HOUR_IN_SECONDS );

Die foreach-Schleife ab Zeile 41 läuft dann alle gefundenen Artikel durch, prüft ob die ID schon bereits vorhanden ist (macht bei größere Anzahl Sinn, da wir ja keine doppelten Artikel sehen wollen) und gibt dann eine Vorschau der Artikel zurück.

Zeile 57-59:
Diese bitte nur einbauen, sofern du auch das optionale „dwc_post_modified_date“ Snippet bei dir eingerichtet hast. Ansonsten einfach entfernen / nicht einbauen. Dies zeigt lediglich zu dem Artikel das Erstellungsdatum oder die letzte Änderung an.

//folgende Zeile NICHT mit einbauen wenn du "dwc_post_modified_date" nicht auch als Snippet benutzt!
$inhalt .= '<div class="su-post-meta">'.dwc_post_modified_date($post->ID).'</div>';
//Zeile drüber und Kommentar beachten!

Ein Wort noch zu den „class“ Klassen… in meinem Beispiel nutze ich css-Klassen aus dem PlugIn „ShortcodeUltimate“ – solltest du dies nicht haben, werden diese natürlich ignoriert. Hier kannst du entweder eigene Klassen (die du nutzt) eintragen, leer lassen oder so wie sie jetzt auch sind belassen…. Ist halt Optik 😉

In der letzten (75) Zeile erstellen wir dann unser eigenes Random Post Shortcode

add_shortcode( 'random_post', 'dwc_random_post_shortcode' );

Mit Shortcode: [random_post] können wir es dann später überall benutzen.

Feedback kannst du gerne hier abgeben 🙂
Fragen natürlich auch !


Du würdest auch gerne Feedback geben?
Mir mitteilen dass ich dir helfen konnte?
Einfach nur „Danke“ sagen?
Oder mir etwas mitteilen was nicht so toll war?
Du hast ein Problem oder nur eine Frage?
Na dann los!

Möchtest du diese Seite und mich sogar unterstützen?!

Du kannst mich z.B. auf Patreon besuchen und kleinere Pakete schnüren. Es gibt dann auch ein paar Vorzüge 🙂


Schreibe einen Kommentar