<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>propz</title>
	<atom:link href="https://propz.de/feed/" rel="self" type="application/rss+xml" />
	<link>https://propz.de/</link>
	<description>Kreative Design Beratung und interaktive Workshops</description>
	<lastBuildDate>Fri, 11 Jul 2025 21:22:45 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>FAIR Package Manager: WordPress Revolution</title>
		<link>https://propz.de/blog/fair-package-manager-wordpress-revolution/</link>
					<comments>https://propz.de/blog/fair-package-manager-wordpress-revolution/#respond</comments>
		
		<dc:creator><![CDATA[propz]]></dc:creator>
		<pubDate>Wed, 18 Jun 2025 01:47:30 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[fair]]></category>
		<category><![CDATA[linux foundation]]></category>
		<category><![CDATA[package manager]]></category>
		<guid isPermaLink="false">https://propz.de/?p=973</guid>

					<description><![CDATA[<p>Das ist mal ne Ansage: Die Linux Foundation hat gerade das FAIR Package Manager Projekt aus der Taufe gehoben.</p>
<p>Der Beitrag <a href="https://propz.de/blog/fair-package-manager-wordpress-revolution/">FAIR Package Manager: WordPress Revolution</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Das sind extrem spannende Neuigkeiten für alle, die mit WordPress arbeiten.</p>



<h2 class="wp-block-heading">Was ist dieser FAIR Package Manager eigentlich?</h2>



<p>Stell dir vor, du könntest deine WordPress-Plugins und Themes nicht nur aus dem offiziellen WordPress-Repository (wordpress.org) ziehen, sondern aus verschiedenen vertrauenswürdigen Quellen – genau das macht FAIR möglich. D.h. konkret, dass du nicht mehr auf eine einzige Quelle angewiesen bist.</p>



<p>Der Name steht übrigens für <em>"Federated and Independent Repository".</em></p>



<h2 class="wp-block-heading">Warum das ein Game-Changer ist</h2>



<p>Normalerweise sind alle WordPress Websites zu 100% von wordpress.org abhängig und wenn da mal was schief geht, stehst du da wie der Ochs vorm Berg. Mit FAIR löst sich das Problem elegant auf.</p>



<p>Hier die wichtigen Vorteile:</p>



<ul class="wp-block-list">
<li><strong>Mehr Sicherheit</strong>: Das System baut Sicherheit direkt in die Lieferkette ein. Bessere Verschlüsselung, vertrauenswürdige Quellen – das ganze Programm.</li>



<li><strong>GDPR-Compliance</strong>: Endlich weniger automatische Datenübertragungen an kommerzielle Anbieter. Deine Kunden werden es dir danken.</li>



<li><strong>Dezentralisierung</strong>: Keine Abhängigkeit mehr von einer einzigen Quelle.</li>



<li><strong>Bessere Entdeckbarkeit</strong>: Plugins und Tools werden leichter findbar, auch wenn sie nicht im Haupt-Repository stehen.</li>
</ul>



<h2 class="wp-block-heading">Wer steckt dahinter?</h2>



<p>Eine beeindruckende Truppe: Die technische Leitung übernehmen Carrie Dils, Mika Epstein und Ryan McCue – alles echte WordPress-Veteranen mit 15+ Jahren Erfahrung.</p>



<p>Ryan McCue hat die WordPress REST API entwickelt und Mika Epstein war früher sogar Managerin des Plugin-Repositorys.</p>



<h2 class="wp-block-heading">So gehst du vor</h2>



<p>Bock auf die neue Technologie? So steigst du ein:</p>



<ol class="wp-block-list">
<li><strong>Informiere dich</strong>: Schau dir das GitHub-Repository an unter https://github.com/fairpm</li>



<li><strong>Teste es</strong>: Das Shared Repository ist bereits live und nimmt Beiträge an</li>



<li><strong>Plane deine Migration</strong>: Überlege, welche deiner Projekte von FAIR profitieren könnten</li>



<li><strong>Verfolge die Entwicklung</strong>: Halte Ausschau nach Ankündigungen zu Governance und Finanzierung</li>
</ol>



<h2 class="wp-block-heading">Meine ehrliche Einschätzung</h2>



<p>So, jetzt mal Butter bei die Fische: Das ist ein wichtiger Schritt für das WordPress-Ökosystem. Nach 15+ Jahren in der Branche kann ich dir sagen: Solche Dezentralisierungsansätze sind längst überfällig.</p>



<p>WordPress hat sich über die Jahre stark fragmentiert. FAIR könnte das Zeug dazu haben, die Community wieder zusammenzubringen. Und das ist super wichtig für die Zukunft der Plattform.</p>



<p>Natürlich ist das Projekt noch jung. Es wird dauern, bis sich ein robustes Ökosystem entwickelt. Aber die Grundlagen sind da, und die Köpfe dahinter wissen, was sie tun.</p>
<p>Der Beitrag <a href="https://propz.de/blog/fair-package-manager-wordpress-revolution/">FAIR Package Manager: WordPress Revolution</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://propz.de/blog/fair-package-manager-wordpress-revolution/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Hooks: Actions &#038; Filters einfach erklärt</title>
		<link>https://propz.de/blog/wordpress-hooks-actions-filters-einfach-erklaert/</link>
					<comments>https://propz.de/blog/wordpress-hooks-actions-filters-einfach-erklaert/#comments</comments>
		
		<dc:creator><![CDATA[propz]]></dc:creator>
		<pubDate>Wed, 05 Jun 2024 09:33:00 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[actions]]></category>
		<category><![CDATA[filters]]></category>
		<category><![CDATA[hooks]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://propz.de/?p=1091</guid>

					<description><![CDATA[<p>Hooks sind super wichtig, wenn du WordPress, als Entwicklerin, wirklich beherrschen willst. Falls du noch nie was davon gehört hast, wird sich das jetzt schnell auflösen.</p>
<p>Der Beitrag <a href="https://propz.de/blog/wordpress-hooks-actions-filters-einfach-erklaert/">WordPress Hooks: Actions &amp; Filters einfach erklärt</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Mit Actions und Filter kannst du u.a. Code ausführen und Daten manipulieren ohne Original Template-/Plugin-Dateien verändern zu müssen. Dadurch bleibt dein Code auch nach Plugin/Themes Updates funktional und zerhaut deine Website nicht.</p>



<p><strong>Es gibt zwei Arten von Hooks:</strong></p>



<h3 class="wp-block-heading">Actions (Aktionen)</h3>



<ul class="wp-block-list">
<li>Werden zu bestimmten Zeitpunkten ausgeführt</li>



<li>Du machst etwas, gibst aber nichts zurück</li>



<li><strong>1. Beispiel:</strong> Kritisches CSS im &lt;head&gt; ausgeben</li>



<li><strong>2. Beispiel:</strong> E-Mail senden, wenn ein Post veröffentlicht wird</li>
</ul>



<h3 class="wp-block-heading">Filters (Filter)</h3>



<ul class="wp-block-list">
<li>Verändern Daten, bevor sie angezeigt werden</li>



<li>Du bekommst etwas, veränderst es und gibst es zurück</li>



<li><strong>3. Beispiel:</strong> Standard Thumbnail setzen</li>



<li><strong>4. Beispiel:</strong> Versionsparameter aus Skripten entfernen</li>
</ul>



<h2 class="wp-block-heading" id="easy-setup">Easy Setup: So funktioniert's</h2>



<p>Die Grundsyntax von Action und Filter Hooks sehen wie folgt aus:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">add_action( $hook_name, $funktionsname, $prioritaet, $anzahl_parameter );
add_filter( $filter_name, $funktionsname, $prioritaet, $anzahl_parameter );</code></span></pre>


<h3 class="wp-block-heading">Action Hook einbauen</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">meine_super_funktion</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-comment">// Dieser Code wird einfach an dieser Stelle ausgeführt</span>
}
add_action(<span class="hljs-string">'hook_name'</span>, <span class="hljs-string">'meine_super_funktion'</span>);</code></span></pre>


<h3 class="wp-block-heading">Filter Hook einbauen:</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">meine_filter_funktion</span><span class="hljs-params">($data)</span> </span>{
    <span class="hljs-comment">// Hier können wir $data verändern</span>
    <span class="hljs-keyword">return</span> $data;
}
add_filter(<span class="hljs-string">'hook_name'</span>, <span class="hljs-string">'meine_filter_funktion'</span>);</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity" style="margin-top:var(--wp--preset--spacing--large);margin-bottom:var(--wp--preset--spacing--large)"/>



<h2 class="wp-block-heading" id="praxis-beispiele">4 Praxis-Beispiele, die du sofort nutzen kannst</h2>



<h3 class="wp-block-heading" id="beispiel-1">1. Action: Kritisches CSS (Above the fold) im &lt;head&gt; Bereich ausgeben (wp_head action)</h3>



<p>Das mache ich gerne in meinen WordPress Templates um FOUC (Flash of unstyled content) zu vermeiden, denn das CSS wird SOFORT vom Browser gerendert, noch bevor andere CSS Dateien geladen werden.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">prpz_critical_css</span><span class="hljs-params">()</span> </span>{
	<span class="hljs-keyword">echo</span> <span class="hljs-string">'&lt;style&gt;'</span> . file_get_contents( get_template_directory() . <span class="hljs-string">'/styles/critical.css'</span> ) . <span class="hljs-string">'&lt;/style&gt;'</span>;
}
add_action( <span class="hljs-string">'wp_head'</span>, <span class="hljs-string">'prpz_critical_css'</span>, <span class="hljs-number">100</span> );</code></span></pre>


<p><strong>Zur Erklärung nochmal:</strong> Bei actions wird dein Code einfach 1 zu 1 an der entsprechenden Stelle ausgegeben/ausgeführt.</p>



<h3 class="wp-block-heading" id="beispiel-2">2. Action: Automatische E-Mail bei neuen Posts</h3>



<p>Möchtest du vielleicht deine Autorinnen benachrichtigen wenn ein entsprechender Artikel veröffentlicht wird? Da kannst du dich auch einfach "einhaken", Daten aufbereiten und per E-Mail senden.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">prpz_notify_author_after_post_publish</span><span class="hljs-params">($post_id)</span> </span>{ 
	$post = get_post($post_id);
	$author = get_userdata($post-&gt;post_author);
	$subject = <span class="hljs-string">"Dein Post wurde veröffentlicht"</span>;
	$headers = <span class="hljs-string">'From: '</span>.get_bloginfo( <span class="hljs-string">'name'</span> ).<span class="hljs-string">' &lt;info@propz.de&gt;'</span> . <span class="hljs-string">"\r\n"</span>;
	$message = <span class="hljs-string">"
		Moin "</span>.$author-&gt;display_name.<span class="hljs-string">",

		Dein Post \""</span>.$post-&gt;post_title.<span class="hljs-string">"\" wurde gerade veröffentlicht.
		Post ansehen: "</span>.get_permalink( $post_id ).<span class="hljs-string">"
		
		Danke dir,
		propz"</span>;
		
	wp_mail($author-&gt;user_email, $subject, $message, $headers);
}
add_action(<span class="hljs-string">'publish_post'</span>, <span class="hljs-string">'prpz_notify_author_after_post_publish'</span>);</code></span></pre>


<h3 class="wp-block-heading" id="beispiel-3">3. Filter: Standard Thumbnail setzen</h3>



<p>In diesem Beispiel überprüfen ich ob bereits ein Thumbnail HTML-Markup existiert. Wenn nicht, erstelle ich ein eigenes als Standard Thumbnail (Nutze ich genau so auf meiner Website).</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">prpz_post_thumbnail_html</span><span class="hljs-params">( string $html, int $post_id, int $post_thumbnail_id, string|array $size, string|array $attr )</span>: <span class="hljs-title">string</span>
</span>{
	<span class="hljs-keyword">if</span> ( <span class="hljs-keyword">empty</span>( $html ) )
	{
		$thumbnail_url = <span class="hljs-string">'/uploads/propz-blog-default.svg'</span>;
		$html = <span class="hljs-string">'&lt;img src="'</span> . esc_url( $thumbnail_url ) . <span class="hljs-string">'" alt="'</span> . esc_attr( get_the_title( $post_id ) ) . <span class="hljs-string">'" /&gt;'</span>;
	}

	<span class="hljs-keyword">return</span> $html;
}
add_filter( <span class="hljs-string">'post_thumbnail_html'</span>, <span class="hljs-string">'prpz_post_thumbnail_html'</span>, <span class="hljs-number">10</span>, <span class="hljs-number">5</span> );</code></span></pre>


<p>Woher weiß ich welche Parameter da genau übergeben werden und was da drin ist? Google (In diesem Fall: <em>"wordpress post thumbnail hooks"</em>)! Dann kommt man schnell zu der offiziellen WordPress Dokumentation für entsprechende Hooks. <a href="https://developer.wordpress.org/reference/hooks/post_thumbnail_html/" target="_blank" rel="noreferrer noopener">Hier der Link zur Dokumentation des oberen Beispiels.</a></p>



<h3 class="wp-block-heading" id="beispiel-4">4. Filter: Versionsparameter aus Skripten und Styles entfernen</h3>



<p>Hier kann ich sogar die gleiche Funktion für zwei unterschiedliche Filter nutzen weil beide Filter gleich funktionieren.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">prpz_remove_version</span><span class="hljs-params">( string $src )</span>: <span class="hljs-title">string</span> </span>{
	<span class="hljs-keyword">if</span>( strpos( $src, <span class="hljs-string">'?ver='</span> ) )
		$src = remove_query_arg( <span class="hljs-string">'ver'</span>, $src );
	<span class="hljs-keyword">return</span> $src;
}
add_filter( <span class="hljs-string">'style_loader_src'</span>, <span class="hljs-string">'prpz_remove_version'</span>, <span class="hljs-number">10</span>, <span class="hljs-number">2</span> );
add_filter( <span class="hljs-string">'script_loader_src'</span>, <span class="hljs-string">'prpz_remove_version'</span>, <span class="hljs-number">10</span>, <span class="hljs-number">2</span> );</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity" style="margin-top:var(--wp--preset--spacing--large);margin-bottom:var(--wp--preset--spacing--large)"/>



<h2 class="wp-block-heading" id="wichtige-tipps">Wichtige Tipps</h2>



<h3 class="wp-block-heading">1. Hooks können wieder entfernt und verschoben werden</h3>



<p>Es ist auch möglich bereits vorhandene Hooks von anderen Plugins oder Themes wieder zu entfernen. Ich nutze das gerne bei WooCommerce um z.B. Daten auszublenden die für mich irrelevant oder auch an einer andere Stelle besser aufgehoben wären.</p>



<p>Wie bereits erwähnt kann ich dadurch direkt Einfluss auf das Aussehen der Website nehmen ohne irgendeine Template-Datei anzufassen = Keine Gefahr beim nächsten Update.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// Entferne Produktbewertungen aus der Originalposition...</span>
remove_action( <span class="hljs-string">'woocommerce_after_shop_loop_item_title'</span>, <span class="hljs-string">'woocommerce_template_loop_rating'</span>, <span class="hljs-number">5</span> );

<span class="hljs-comment">// ... und füge es vor dem Produkttitel ein.</span>
add_action( <span class="hljs-string">'woocommerce_shop_loop_item_title'</span>, <span class="hljs-string">'woocommerce_template_loop_rating'</span>, <span class="hljs-number">5</span> );</code></span></pre>


<p>Woher ich weiß wie die Hooks heißen? <a href="https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/templates/content-product.php" target="_blank" rel="noreferrer noopener">Stehen in den WooCommerce Template Dateien drin.</a></p>



<h3 class="wp-block-heading">2. Setze die Prioritäten richtig</h3>



<p>Du kannst bestimmen wann deine action genau ausgeführt wird. Beachte auch das vorherige Beispiel: wenn ich ein Hook entfernen möchte, muss ich ebenfalls die Original-Priorität kennen, sonst funktioniert das nicht.</p>


<pre class="wp-block-code"><span><code class="hljs language-php">add_action(<span class="hljs-string">'hook_name'</span>, <span class="hljs-string">'meine_funktion'</span>, <span class="hljs-number">10</span>); <span class="hljs-comment">// Standard-Priorität</span>
add_action(<span class="hljs-string">'hook_name'</span>, <span class="hljs-string">'wichtige_funktion'</span>, <span class="hljs-number">1</span>); <span class="hljs-comment">// Läuft früher</span>
add_action(<span class="hljs-string">'hook_name'</span>, <span class="hljs-string">'spaete_funktion'</span>, <span class="hljs-number">99</span>); <span class="hljs-comment">// Läuft später</span></code></span></pre>


<h3 class="wp-block-heading">3. Setze die Anzahl der übergebenen Parameter richtig</h3>



<p>Auch bei den Parametern muss du gut aufpassen. Wenn du die Anzahl der übergebenen/erwarteten Parameter falsch einträgst wird WordPress einen "fatal error" schmeißen. Woher weißt du wie viele Parameter übergeben werden? Die Dokumentation wird es dir verraten.</p>



<p>Du kannst es auch direkt an der Stelle erkennen wo der entsprechende Hook ausgeführt wird.</p>



<h3 class="wp-block-heading">4. Hooks werden nur ausgeführt wenn sie wirklich existieren</h3>



<p>Wenn du einen Hook aufrufst der nicht existiert, passiert auch nichts. Es gibt keinen Fehler o.ä. D.h. du kannst auch ohne Probleme Plugins deaktivieren, Updates installieren und es wird alles wie gewohnt funktionieren.</p>



<p><strong>Der Nachteil:</strong> wenn du dich verschreibst, wirst du keine Fehlermeldung bekommen, überprüfe den Hook Namen also immer doppelt.</p>



<h3 class="wp-block-heading">5. Gib bei Filtern mindestens den Original-Wert zurück</h3>



<p>Falls du mit einem Filter Daten manipulieren möchtest, vergiss nicht den Original-Wert zurückzugeben, wenn du keine Änderung vorgenommen hast.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">prpz_maybe_hide_quantity_on_checkout</span><span class="hljs-params">( string $quantity_markup, array $cart_item, string $cart_item_key)</span>: <span class="hljs-title">string</span> </span>{
	<span class="hljs-comment">// Verstecke "Menge" Feld, wenn das Produkt nur einzelnt verkauft wird</span>
	<span class="hljs-keyword">if</span> ( $cart_item&#91;<span class="hljs-string">'data'</span>]-&gt;is_sold_individually() )
		<span class="hljs-keyword">return</span> <span class="hljs-string">''</span>;

	<span class="hljs-comment">// Wichtig:</span>
	<span class="hljs-comment">// Gib den Original-Wert zurück: $quantity_markup</span>
	<span class="hljs-comment">// Sonst wird das Feld nie angezeigt und das wollen wir ja nicht.</span>
	<span class="hljs-keyword">return</span> $quantity_markup;
}
add_filter( <span class="hljs-string">'woocommerce_checkout_cart_item_quantity'</span>, <span class="hljs-string">'prpz_maybe_hide_quantity_on_checkout'</span>, <span class="hljs-number">10</span>, <span class="hljs-number">3</span>);</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity" style="margin-top:var(--wp--preset--spacing--large);margin-bottom:var(--wp--preset--spacing--large)"/>



<h2 class="wp-block-heading" id="funktionsweise-verstehen">Funktionsweise von Hooks richtig verstehen</h2>



<p>Nicht alle Plugins/Themes sind gut dokumentiert. Manchmal muss man sich den Code des Plugins zu Gemüte führen. Wie kannst du dann verstehen was der Hook genau macht? Ich werde hier zwei komplexere Beispiele genauer erläutern.</p>



<h3 class="wp-block-heading">1. So findest du Hooks</h3>



<p><strong>Actions werden vom Code-Autor festgelegt.</strong></p>



<p>Diese erkennst du wenn "do_action" ausgeführt wird. D.h. überall wo <em>do_action</em> erscheint, kannst du dich mit <em>add_action</em> einhaken.</p>



<p>Bei Filter heißt es "apply_filters". D.h. überall wo <em>apply_filters</em> ausgeführt wird, kannst dich mit <em>add_filter</em> einhaken und die Daten manipulieren.</p>



<h3 class="wp-block-heading">2. Filter verstehen</h3>



<p>Für meinen Webshop nutze ich "WooCommerce Germanized" als extra Plugin. Das Plugin bietet auch die Option um Produktbilder im Checkout anzuzeigen. Das ist eine coole Funktion, aber für bestimmte Produkte möchte ich das nicht. Also habe ich in den Plugin Template Dateien gesucht ob ich das beeinflussen kann und folgendes gefunden:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">...
<span class="hljs-keyword">if</span> ( apply_filters( <span class="hljs-string">'woocommerce_gzd_checkout_table_needs_thumbnail'</span>, ( ! strstr( $cart_item_name, $thumbnail ) ), $cart_item, $cart_item_key ) ) {
...</code></span></pre>


<p>Genau da wird überprüft ob das Thumbnail dargestellt werden soll. Da der Plugin Entwickler mitgedacht hat, hat er dort ein Filter eingebaut, damit ich mich bei Bedarf einklinken kann.</p>



<p><strong>Zur Erklärung:</strong><br><strong>Der erste Parameter ist immer der, der auch zurückgegeben wird</strong>: strstr Funktion gibt string oder false zurück.</p>



<p><strong>Zusätzlich dazu bekommen wir weitere Parameter die für den Kontext relevant sind</strong>: $cart_item und $cart_item_key (in dem Kontext werden alle Warenkorb Produkte geloopt). </p>



<p>So sieht dann mein Code aus:</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">prpz_maybe_hide_thumbnail_on_checkout</span><span class="hljs-params">( bool|string $needs_thumbnail, array $cart_item, string $cart_item_key )</span>: <span class="hljs-title">bool</span>|<span class="hljs-title">string</span> </span>{
	<span class="hljs-keyword">if</span> ( $cart_item&#91;<span class="hljs-string">'data'</span>]-&gt;is_downloadable() || $cart_item&#91;<span class="hljs-string">'data'</span>]-&gt;is_virtual() )
	{
		<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
	}
	<span class="hljs-keyword">return</span> $needs_thumbnail;
}
add_filter( <span class="hljs-string">'woocommerce_gzd_checkout_table_needs_thumbnail'</span>, <span class="hljs-string">'prpz_maybe_hide_thumbnail_on_checkout'</span>, <span class="hljs-number">100</span>, <span class="hljs-number">3</span> );</code></span></pre>


<p>So kann ich selber überprüfen ob ich das Thumbnail für das jeweilige Produkt anzeigen lassen möchte oder nicht.</p>



<h3 class="wp-block-heading">3. Action verstehen</h3>



<p>Bei actions verhält sich das ganz ähnlich, mit dem Unterschied, dass kein Rückgabewert erwartet wird. Sehen wir uns dazu das <a href="#beispiel-2">2. Beispiel</a> an. Die <a href="https://developer.wordpress.org/reference/hooks/new_status_post-post_type/" target="_blank" rel="noreferrer noopener"><em>do_action</em> Dokumentation</a> sagt folgendes:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">do_action( “{$new_status}_{$post-&gt;post_type}”, int $post_id, WP_Post $post, string $old_status );</code></span></pre>


<p>Hier wirds noch abgefahrener, denn der Hook Name wird dynamisch erstellt. Long story short: als Parameter bekommen wir die wichtigsten Daten um an der entsprechenden Stelle benötigte Aktionen ausführen zu können.</p>



<p>Im besten Fall gibt es eine Dokumentation dazu aber wir können auch ohne Probleme auch aus dem Code rauslesen was wir genau brauchen und wie wir es nutzen können.</p>



<h2 class="wp-block-heading" id="hooks-finden">Wo findest du alle verfügbaren Hooks?</h2>



<p>WordPress hat unzählige Hooks! Die findest du im WordPress Codex oder in der Code Reference. Einfach nach "wordpress [dein Thema] hook" googeln und du findest schon was passendes.</p>



<h2 class="wp-block-heading">Dein nächster Schritt</h2>



<p>Jetzt ans Eingemachte! Schnapp dir ein Beispiel von oben und probier's aus. Am besten in einem Child-Theme oder einem Test-Plugin, dann machst du auch nix kaputt.</p>



<p>Mit diesem Wissen kannst du WordPress nach deinen Vorstellungen anpassen, ohne Plugin-/Template-Dateien zu zerstören. Das ist professionelle WordPress-Entwicklung at its finest!</p>



<p>WordPress hat zu dem Thema auch noch einige ausführlichere Artikel erstellt. Schaut mal bei denen vorbei falls ihr noch Fragen habt:</p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/plugins/hooks/" target="_blank" rel="noreferrer noopener">Hooks</a></li>



<li><a href="https://developer.wordpress.org/plugins/hooks/actions/" target="_blank" rel="noreferrer noopener">Actions</a></li>



<li><a href="https://developer.wordpress.org/plugins/hooks/filters/" target="_blank" rel="noreferrer noopener">Filters</a></li>
</ul>
<p>Der Beitrag <a href="https://propz.de/blog/wordpress-hooks-actions-filters-einfach-erklaert/">WordPress Hooks: Actions &amp; Filters einfach erklärt</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://propz.de/blog/wordpress-hooks-actions-filters-einfach-erklaert/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Google Sign-in Pop-ups deaktivieren - so geht&#039;s richtig!</title>
		<link>https://propz.de/blog/google-sign-in-pop-ups-deaktivieren/</link>
					<comments>https://propz.de/blog/google-sign-in-pop-ups-deaktivieren/#comments</comments>
		
		<dc:creator><![CDATA[propz]]></dc:creator>
		<pubDate>Wed, 29 May 2024 10:41:00 +0000</pubDate>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[datenschutz]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://propz.de/?p=993</guid>

					<description><![CDATA[<p>Du surfst entspannt durchs Netz und plötzlich knallt dir wieder so ein "Mit Google anmelden" Pop-up entgegen. Mich nervt es tierisch, dich wahrscheinlich auch, deshalb zeige ich dir wie man es loswird.</p>
<p>Der Beitrag <a href="https://propz.de/blog/google-sign-in-pop-ups-deaktivieren/">Google Sign-in Pop-ups deaktivieren - so geht&#039;s richtig!</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Denn mal ehrlich: Diese Dinger tauchen gefühlt auf jeder zweiten Website auf und unterbrechen deinen Flow. Und das Schlimmste: Du klickst sie weg, aber beim nächsten Besuch sind sie wieder da. 😡</p>



<h2 class="wp-block-heading">Direkt zum Punkt - hier ist die richtige Lösung:</h2>



<p>Jetzt wird's interessant, denn viele Anleitungen im Netz sind schlichtweg falsch oder veraltet. Hier ist der Weg, der wirklich funktioniert <strong>(Stand: 06.2025)</strong>:</p>



<h3 class="wp-block-heading">Schritt-für-Schritt Anleitung</h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<p>1. Geh zu deinen <strong>Google Sicherheits-Einstellungen</strong>:</p>



<ul class="wp-block-list">
<li>Hier kommst du direkt zu den "<strong>Sicherheit</strong>" Einstellungen in deinem Google Konto: <a href="https://myaccount.google.com/u/1/security" target="_blank" rel="noreferrer noopener">https://myaccount.google.com/u/1/security</a> (du musst natürlich mit deinem Konto angemeldet sein).</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure data-wp-context="{&quot;imageId&quot;:&quot;69cd5b2a53b5a&quot;}" data-wp-interactive="core/image" data-wp-key="69cd5b2a53b5a" class="wp-block-image size-full is-style-propz wp-lightbox-container"><img fetchpriority="high" decoding="async" width="467" height="614" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://propz.de/uploads/propz-deactivate_google_sign_in-01.webp" alt="" class="wp-image-995"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Vergrößern"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<p>2. Scrolle runter zum Punkt <strong>"Ihre Verbindungen zu Drittanbieter-Apps und ‑diensten"</strong> und klickt da auf <strong>"Alle Verbindungen ansehen"</strong>:</p>



<ul class="wp-block-list">
<li>Hier siehst du eine Übersicht der Dienste/Websites mit denen du dich bereits mit deinem Google Konto angemeldet hast.</li>



<li>Auf Englisch heißt es <strong>"Your connections to third-party apps and services"</strong> -> <strong>"See all connections"</strong></li>
</ul>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure data-wp-context="{&quot;imageId&quot;:&quot;69cd5b2a5464e&quot;}" data-wp-interactive="core/image" data-wp-key="69cd5b2a5464e" class="wp-block-image size-full is-style-propz wp-lightbox-container"><img decoding="async" width="632" height="707" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://propz.de/uploads/propz-deactivate_google_sign_in-02.webp" alt="" class="wp-image-996" srcset="https://propz.de/uploads/propz-deactivate_google_sign_in-02.webp 632w, https://propz.de/uploads/propz-deactivate_google_sign_in-02-600x671.webp 600w" sizes="(max-width: 632px) 100vw, 632px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Vergrößern"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<p>3. Oben rechts auf das <strong>Zahnrad-Symbol</strong> klicken.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure data-wp-context="{&quot;imageId&quot;:&quot;69cd5b2a54ea0&quot;}" data-wp-interactive="core/image" data-wp-key="69cd5b2a54ea0" class="wp-block-image size-full is-style-propz wp-lightbox-container"><img decoding="async" width="888" height="372" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://propz.de/uploads/propz-deactivate_google_sign_in-03.webp" alt="" class="wp-image-997" srcset="https://propz.de/uploads/propz-deactivate_google_sign_in-03.webp 888w, https://propz.de/uploads/propz-deactivate_google_sign_in-03-768x322.webp 768w, https://propz.de/uploads/propz-deactivate_google_sign_in-03-600x251.webp 600w" sizes="(max-width: 888px) 100vw, 888px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Vergrößern"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>
</div>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<p>4. <strong>"Aufforderung zur Anmeldung"</strong> (<em>"Sign-in prompts"</em>) ist die Einstellung die wir gesucht haben, einfach deaktivieren.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure data-wp-context="{&quot;imageId&quot;:&quot;69cd5b2a55703&quot;}" data-wp-interactive="core/image" data-wp-key="69cd5b2a55703" class="wp-block-image size-full is-style-propz wp-lightbox-container"><img loading="lazy" decoding="async" width="815" height="759" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://propz.de/uploads/propz-deactivate_google_sign_in-04.webp" alt="" class="wp-image-998" srcset="https://propz.de/uploads/propz-deactivate_google_sign_in-04.webp 815w, https://propz.de/uploads/propz-deactivate_google_sign_in-04-768x715.webp 768w, https://propz.de/uploads/propz-deactivate_google_sign_in-04-600x559.webp 600w" sizes="auto, (max-width: 815px) 100vw, 815px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Vergrößern"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>
</div>



<p>Et voilà! Das war's schon. Super easy, oder?</p>



<h2 class="wp-block-heading">Was passiert dannn?</h2>



<p>Nach der Deaktivierung sollten die nervigen Pop-ups verschwinden. Bei mir haben die Popups tatsächlich sofort (nach einem Website reload) aufgehört.</p>



<p>Ich finds schon frech von Google, diese Pop-ups so aggressiv zu pushen, aber auch das ist ja nichts neues. Wenn du der Anleitung folgst wird sich das Problem für dich schnell auflösen.</p>
<p>Der Beitrag <a href="https://propz.de/blog/google-sign-in-pop-ups-deaktivieren/">Google Sign-in Pop-ups deaktivieren - so geht&#039;s richtig!</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://propz.de/blog/google-sign-in-pop-ups-deaktivieren/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Login URL anpassen: von wp-login.php zu /login</title>
		<link>https://propz.de/blog/wordpress-wp-login-url-anpassen/</link>
					<comments>https://propz.de/blog/wordpress-wp-login-url-anpassen/#respond</comments>
		
		<dc:creator><![CDATA[propz]]></dc:creator>
		<pubDate>Wed, 03 Apr 2024 16:28:07 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://propz.de/?p=272</guid>

					<description><![CDATA[<p>Einfach mal eine Login URL einrichten die man sich gut merken kann, das geht in zwei Schritten.</p>
<p>Der Beitrag <a href="https://propz.de/blog/wordpress-wp-login-url-anpassen/">WordPress Login URL anpassen: von wp-login.php zu /login</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Voraussetzungen</h3>



<p>Du brauchst Zugriff auf deine functions.php und auf deine .htaccess Datei.</p>



<h3 class="wp-block-heading">So wirds gemacht:</h3>



<p>Damit du dich in Zukunft einfach über <strong>meinedomain.de/login </strong>einloggen kannst musst du zwei Dinge tun...</p>



<h2 class="wp-block-heading">1. htaccess Weiterleitung hinzufügen</h2>



<p>Die Original htaccess von WordPress sieht so aus:</p>


<pre class="wp-block-code"><span><code class="hljs language-apache"><span class="hljs-comment"># BEGIN WordPress</span>
<span class="hljs-section">&lt;IfModule mod_rewrite.c&gt;</span>
<span class="hljs-attribute"><span class="hljs-nomarkup">RewriteEngine</span></span> <span class="hljs-literal">On</span>
<span class="hljs-attribute">RewriteBase</span> /
<span class="hljs-attribute"><span class="hljs-nomarkup">RewriteCond</span></span> <span class="hljs-variable">%{REQUEST_FILENAME}</span> !-f
<span class="hljs-attribute"><span class="hljs-nomarkup">RewriteCond</span></span> <span class="hljs-variable">%{REQUEST_FILENAME}</span> !-d
<span class="hljs-attribute"><span class="hljs-nomarkup">RewriteRule</span></span> . /index.php<span class="hljs-meta"> &#91;L]</span>
<span class="hljs-section">&lt;/IfModule&gt;</span>
<span class="hljs-comment"># END WordPress</span></code></span></pre>


<p>Direkt unterhalb von</p>


<pre class="wp-block-code"><span><code class="hljs language-apache"><span class="hljs-attribute">RewriteBase</span> /</code></span></pre>


<p>musst du folgendes einfügen:</p>


<pre class="wp-block-code"><span><code class="hljs language-apache"><span class="hljs-attribute"><span class="hljs-nomarkup">RewriteRule</span></span> ^login$ wp-login.php</code></span></pre>


<p>Dieser Code sorgt dafür, dass die richtige Datei geladen wird, wenn du <strong>meinedomain.de/login</strong> im Browser eingibst.</p>



<h2 class="wp-block-heading">2. Interne URL's anpassen</h2>



<p>Wenn du das erledigt hast wird es schon funktionieren, probier es mal aus. <strong>ABER: </strong>Damit WordPress selber auch richtig umleitet (z.B. wenn man auf <strong>meinedomain.de/wp-admin</strong> geht) brauchst du noch eine weitere PHP Funktion um interne URL's ebenfalls anzupassen. Der Code kommt dann in deine functions.php.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">propz_custom_login_url</span><span class="hljs-params">( $url )</span>
</span>{
	$alt = <span class="hljs-string">'wp-login.php'</span>;
	$neu = <span class="hljs-string">'login'</span>;
	<span class="hljs-keyword">return</span> str_replace( $alt, $neu, $url );
}
add_filter( <span class="hljs-string">'site_url'</span>, <span class="hljs-string">'propz_custom_login_url'</span>, <span class="hljs-number">10</span> );</code></span></pre>


<p>Dieser Code sorgt dafür, dass immer wenn WordPress selber zur wp-login.php Datei weiterleiten möchte, anstelle der alten einfach die neue URL zurückgegeben wird. Dadurch leitet <strong>meinedomain.de/wp-admin</strong> ebenfalls zu <strong>meinedomain.de/login</strong> weiter.</p>



<p>Eh voilá!</p>



<p>Die Originalanleitung hab ich hier gefunden: <a href="https://wordpress.org/support/topic/how-to-change-from-wp-loginphp-to-login/" target="_blank" rel="noreferrer noopener">https://wordpress.org/support/topic/how-to-change-from-wp-loginphp-to-login/</a></p>
<p>Der Beitrag <a href="https://propz.de/blog/wordpress-wp-login-url-anpassen/">WordPress Login URL anpassen: von wp-login.php zu /login</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://propz.de/blog/wordpress-wp-login-url-anpassen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress REST-API URL Präfix (wp-json) anpassen</title>
		<link>https://propz.de/blog/wordpress-rest-api-url-praefix-wp-json-anpassen/</link>
					<comments>https://propz.de/blog/wordpress-rest-api-url-praefix-wp-json-anpassen/#respond</comments>
		
		<dc:creator><![CDATA[propz]]></dc:creator>
		<pubDate>Tue, 02 Apr 2024 21:24:26 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://propz.de/?p=261</guid>

					<description><![CDATA[<p>Das Anpassen des WordPress REST-API URL (wp-json) ist super einfach und kann über einen einzigen Filter erfolgen.</p>
<p>Der Beitrag <a href="https://propz.de/blog/wordpress-rest-api-url-praefix-wp-json-anpassen/">WordPress REST-API URL Präfix (wp-json) anpassen</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Ob es dir um Sicherheit (Abwehren von Bots) oder Style (propz) geht: die Änderung der REST-API URL ist super einfach und erfolgt über den <strong><em>rest_url_prefix</em></strong> Filter. Pack den nachfolgenden Code einfach in deine functions.php, aktualisiere deine Permalinks und es dürfte sofort funktionieren.</p>



<h3 class="wp-block-heading"><strong>Voraussetzungen</strong></h3>



<ul class="wp-block-list">
<li>Du brauchst Zugriff auf deine functions.php Datei</li>
</ul>



<h3 class="wp-block-heading">Der Code</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/**
 * Custom WordPress REST-API URL Prefix
 * 
 * <span class="hljs-doctag">@param</span> string $prefix - Current prefix
 * <span class="hljs-doctag">@return</span> string
 */</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">propz_rest_url_prefix</span><span class="hljs-params">( $prefix )</span>
</span>{
	<span class="hljs-keyword">return</span> <span class="hljs-string">'rastafapi'</span>;
}
add_filter( <span class="hljs-string">'rest_url_prefix'</span>, <span class="hljs-string">'propz_rest_url_prefix'</span> );</code></span></pre>


<p>Nachdem du den Code implementiert hast musst du einmalig die Permalinks aktualisieren: Einfach zur Permalink Einstellungsseite gehen und speichern ohne Änderungen vorzunehmen.</p>



<h3 class="wp-block-heading"><strong>Das Ergebnis</strong></h3>



<p>Daraus wird die Original REST API URL wie folgt verändert:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">ALT = Original:
https:<span class="hljs-comment">//propz.de/wp-json/wp/v2/posts/123</span>

NEU = mit Style:
https:<span class="hljs-comment">//propz.de/rastafapi/wp/v2/posts/123</span></code></span></pre>


<p></p>
<p>Der Beitrag <a href="https://propz.de/blog/wordpress-rest-api-url-praefix-wp-json-anpassen/">WordPress REST-API URL Präfix (wp-json) anpassen</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://propz.de/blog/wordpress-rest-api-url-praefix-wp-json-anpassen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Der beste Weg um eine gesamte Website (inklusive Unterseiten) samt allem Furz und Feuerstein zu downloaden</title>
		<link>https://propz.de/blog/gesamte-website-inklusive-unterseiten-downloaden/</link>
					<comments>https://propz.de/blog/gesamte-website-inklusive-unterseiten-downloaden/#comments</comments>
		
		<dc:creator><![CDATA[propz]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 16:01:46 +0000</pubDate>
				<category><![CDATA[Webdev]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[wget]]></category>
		<guid isPermaLink="false">https://propz.de/?p=244</guid>

					<description><![CDATA[<p>Mit Wget kannst du super easy ganze Webseiten runterladen.</p>
<p>Der Beitrag <a href="https://propz.de/blog/gesamte-website-inklusive-unterseiten-downloaden/">Der beste Weg um eine gesamte Website (inklusive Unterseiten) samt allem Furz und Feuerstein zu downloaden</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Hmm, es ist zwar etwas dubios warum du das machen willst aber hey... Der einfachste Weg eine Website komplett runterzuladen dürfte mit <a href="https://en.wikipedia.org/wiki/Wget" target="_blank" rel="noreferrer noopener">Wget</a> sein (innerhalb der Kommandozeile aka. CLI).</p>



<p class="is-style-heading has-medium-font-size" style="font-style:normal;font-weight:700">Voraussetzungen:</p>



<ol class="wp-block-list">
<li>Du hast bereits Erfahrung mit der Kommandozeile und weißt, was du tust;</li>



<li>Wget ist auf deinem Computer installiert.</li>
</ol>



<h3 class="wp-block-heading">Der Code:</h3>


<pre class="wp-block-code"><span><code class="hljs language-bash"><span class="hljs-comment"># Lädt die gesamte Website runter. Magic!</span>
wget -m -k -K -E -l 7 -t 6 -w 5 https://website.com</code></span></pre>


<p>Wenn du den Befehl ausführst wird die gesamte Website unter der angegebenen Domain runtergeladen. Dabei wird automatisch ein neuer Ordner erstellt (benannt nach der Domain), innerhalb des Pfades wo du dich gerade in der Kommandozeile befindest.</p>



<h3 class="wp-block-heading">Die Erklärung des Befehls und der einzelnen Optionen:</h3>



<ul class="wp-block-list">
<li>"-m": Spiegelt die Webseite, lädt alle Dateien und Unterverzeichnisse herunter.</li>



<li>"-k": Konvertiert Links, sodass sie lokal funktionieren.</li>



<li>"-K": Behält den ursprünglichen Dateinamen bei, wenn die Datei bereits vorhanden ist.</li>



<li>"-E": Fügt die Erweiterung ".html" zu HTML-Dateien ohne sie hinzu.</li>



<li>"-l 7": Rekursionstiefe auf 7 beschränkt, um nicht zu viele Seiten herunterzuladen.</li>



<li>"-t 6": Versucht 6 Mal, eine Verbindung herzustellen, bevor es aufgibt.</li>



<li>"-w 5": Wartet 5 Sekunden zwischen den einzelnen Anfragen, um den Server nicht zu überlasten.</li>
</ul>



<p>Den Code habe ich übrigens bei Stack Overflow gefunden: <a href="https://stackoverflow.com/questions/9265172/scrape-an-entire-website">https://stackoverflow.com/questions/9265172/scrape-an-entire-website</a></p>
<p>Der Beitrag <a href="https://propz.de/blog/gesamte-website-inklusive-unterseiten-downloaden/">Der beste Weg um eine gesamte Website (inklusive Unterseiten) samt allem Furz und Feuerstein zu downloaden</a> erschien zuerst auf <a href="https://propz.de">propz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://propz.de/blog/gesamte-website-inklusive-unterseiten-downloaden/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
	</channel>
</rss>
