<?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/"
	 xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Du hast nach wordpress gesucht - Macnotes.de</title>
	<atom:link href="https://macnotes.de/search/wordpress/feed/rss2/" rel="self" type="application/rss+xml" />
	<link>https://macnotes.de/</link>
	<description>iPhone, iPod, iPad, Mac - das unabhängige Magazin rund um Apple</description>
	<lastBuildDate>Fri, 16 Sep 2022 13:15:45 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://macnotes.de/images/2021/02/image-150x150.jpg</url>
	<title>Du hast nach wordpress gesucht - Macnotes.de</title>
	<link>https://macnotes.de/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Apps für die Selbstständigkeit</title>
		<link>https://macnotes.de/2021/11/27/apps-fur-die-selbststandigkeit/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Sat, 27 Nov 2021 15:43:12 +0000</pubDate>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=604916</guid>

					<description><![CDATA[<p>Selbstständigkeit im Berufsleben ist ein sehr weites Feld. Es gibt im Netz super viele Listen mit Apps, die man in der Selbstständigkeit nutzen könnte. Doch die sind oft nur Kopien voneinander und haben keinen Wert, da die Redakteure sie nur aus SEO-Zwecken schreiben und die Apps womöglich selbst noch nicht ausprobiert haben. Ich habe mit [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/11/27/apps-fur-die-selbststandigkeit/">Apps für die Selbstständigkeit</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Selbstständigkeit im Berufsleben ist ein sehr weites Feld. Es gibt im Netz super viele Listen mit Apps, die man in der Selbstständigkeit nutzen könnte. Doch die sind oft nur Kopien voneinander und haben keinen Wert, da die Redakteure sie nur aus SEO-Zwecken schreiben und die Apps womöglich selbst noch nicht ausprobiert haben.</p>
<p>Ich habe mit Absicht als in diesem Beitrag nicht von den „Top X“-Apps geschrieben und werde auch – so hoffe ich – nicht zu viel Software aufführen, die ihr schon kennt. In jedem Fall möchte ich aber meine Erfahrungen in der Selbstständigkeit schildern und die Apps, die mir dabei helfen.</p>
<h2>Es gibt nicht „die“ Apps</h2>
<p>Doch genau da ist ja der Knackpunkt. Ich bin kein Ingenieur und habe CAD-Software hin und wieder für den 3D-Druck im Einsatz. Aber mit meiner Selbstständigkeit hat das dann nichts zu tun. Ich beschränke mich also auf Apps und schildere meine Erfahrungen.</p>
<h2>Aufgabenverwaltung oder To-Do-Apps</h2>
<p>An dieser Stelle folgt einfach gähnende Leere. Denn so sehr ich verstehe, dass es Leute gibt, die Aufgabenverwaltung betreiben, ist das für mich nicht effektiv. Denn Apples Erinnerungen-App ist die einzige Aufgabenverwaltung, die ich nutze, und das auch nur privat. Ich nutze auch Kalender eher sporadisch und auch erst, seit mich Push-Benachrichtigungen darüber informieren. Aktiv setze ich solche Software nicht ein.</p>
<p>Ich musste eine zeitlang beruflich ein Software-Ticketing-System wie <a href="https://www.redmine.org/">Redmine</a> einsetzen. Bei komplexen Projekten erkenne ich dann sogar einen Mehrwert – heute kann man aber Softwareprojekte mit Git und auf Github komfortabler managen. Mein eigenes Business ist nicht derart unüberschaubar und ich gleichzeitig aber so viel interessiert und zerstreut, dass ich am Ende vergessen könnte aktiv in die Aufgabenverwaltung zu blicken. Im Grunde sind Nachrichten und E-Mails meine To-Do-Liste geworden.</p>
<h2>Nachrichten und E-Mails</h2>
<p>Perfekte Überleitung sozusagen. Ich nutze sowohl Gmail als auch Apple Mail und neben iMessage auch <a href="https://slack.com/intl/de-de/">Slack</a> für die berufliche Kommunikation. Audio- und Videotelefonie. Vor Jahren setzten wir auch Skype ein, aber das habe ich als MS Teams, zu dem es nach der Übernahme von Microsoft dann irgendwann wurde, nur noch gebraucht, wenn ein Kunde darauf bestand.</p>
<h2>Texteditoren</h2>
<p>Ich schreibe viel, selbst Gedichte und Prosa, die ich zur Veröffentlichung bringen möchte oder in Teilen auch schon habe. Aber ich schreibe auch viel fürs Web. Da bieten sich Texteditoren mit Schnittstellen zu weitverbreiteten CMS an.</p>
<p>Ein Editor, den ich empfehlen kann und selbst seit Jahren einsetze, ist <a href="https://ulysses.app/">Ulysses</a>, den es sowohl für macOS als auch iOS und iPadOS gibt. Was mir bei dem Editor noch fehlt, ist die Unterstützung von „Custom Post Types“ auf WordPress-Systemen. Ansonsten erlaubt Ulysses den Export als PDF, aber auch auf WordPress, Ghost oder Medium. Man kann damit, und das tue ich mittlerweile, ebenfalls Manuskripte anfertigen. Mir gefallen die Schreibziele und hilfreich ist die seit ein, zwei Jahren enthaltene Rechtschreibkontrolle.</p>
<p>Für die Veröffentlichung von Inhalten im iBooks Store kann man auch auf <a href="https://www.apple.com/de/pages/">Apples Pages</a> (früher iBooks Author) setzen.</p>
<h2>Programmier-Editoren</h2>
<p>Ich arbeite hin und wieder auch im Bereich der Web-Programmierung, habe schon WordPress-Installationen und individuelle Themenprogrammierung umgesetzt. In dem Kontext beschäftigte ich mich mit Ruby (on Rails), Python oder PHP und Javascript und als Programmiereditor meiner Wahl nutze ich deshalb <a href="https://atom.io/">Atom</a>, den es kostenlos gibt. Hin und wieder kommt auch Microsofts <a href="https://code.visualstudio.com/?wt.mc_id=vscom_downloads">Visual Studio Code</a> zum Einsatz. Die App ist ebenfalls kostenlos. Ich nutze außerdem Apples Xcode, aber bislang nur für App-Experimente und nicht im beruflichen Sinn.</p>
<h2>Zeiterfassung</h2>
<p>In meiner Selbstständigkeit ist die Dokumentation meiner Arbeit wichtig. Ich kann auf einem Rechnungsdokument auch notieren, welche Arbeit ich ausgeführt habe. Aber manche Kunden rechnen pro Stunde mit mir ab und also benötigt es ein Tool zur Zeiterfassung. Als ich das erste Mal auf Stundenbasis abrechnen musste, habe ich zunächst nach einer kostenlosen App fürs iPhone gesucht. „<a href="https://web.archive.org/web/20211127233104/https://www.mybettertime.com/de/">My Better Time</a>“ habe ich nach einigem Ausprobieren dann für mich entdeckt und bin der App bis heute treu geblieben. Mittlerweile gibt es die App auch für den Mac und wer mag, kann damit auch Urlaubs-, Feier- oder Krankheitstage festhalten. Der Export der Daten erfolgt in unterschiedliche Formate, wobei die kostenlose Variante im Export eingeschränkt ist.</p>
<h2>Mindmapping</h2>
<p>Es mag komisch klingen, dass ich Aufgabenverwaltungen nicht nutze, sehr wohl aber Mindmaps. Ich mag es, wenn ich große Themen, auf die ich mich einlasse, visualisieren kann. Das hilft mir, den Überblick zu behalten. Als Software meiner Wahl habe ich dazu <a href="https://www.mindnode.com/">MindNode</a> für mich entdeckt. Selbst mit der kostenlosen Variante kann man schon eine Menge anfangen. Vor allem eignet sie sich prima, um auszuprobieren, ob man mit dem Konzept von Mindmaps überhaupt zurechtkommt.</p>
<p>Ich mag Mindmapping auch als kreativen Prozess, habe ihn, ähnlich wie ein paar Schnelllese- und Memorierungstechniken während meiner Studienzeit kennengelernt und viele Bücher dazu gelesen. Eines davon zum Thema „kreative Notizen“ habe ich vor ein paar Jahren sogar mit einem Testbericht bedacht, <a href="https://macnotes.de/2014/01/30/review-das-sketchnote-handbuch-mike-rohde/">das Sketchnote-Handbuch von Mike Rohde</a>.</p>
<h2>Die leidigen Steuern</h2>
<p>Vor Jahren habe ich auch einfach WISO Steuer für den Mac genutzt. Aber die App ist zu träge und in erster Linie für den privaten Gebrauch gedacht und erwähnte ich, dass sie sehr träge ist und mehr oder weniger absolut nicht modern?</p>
<p>Denn es gibt diese neue Kategorie von cloud-gestützten Apps, die einem bei der Buchhaltung helfen wollen und Export-Schnittstellen für den Steuerberater bereithalten, und die man auch auf dem iPhone unterwegs nutzen kann, um Dokumente einzuscannen und zu verarbeiten.</p>
<div data-id="398755" class="ajaxGalleryInit" style="display:none;"></div>
<p>Regelmäßige Leser:innen von Macnotes werden wissen, dass ich den Jahreswechsel 2019/2020 genutzt habe, um eine „neuartige“ Steuersoftware auszuprobieren, mit Datev-Export. Das klappte aber mit mäßigem Erfolg, da es noch viele ungeklärte Sachverhalte gibt, wie ich sogar in einer dem Thema gewidmeten <a href="https://macnotes.de/2021/02/12/sajonaras-7-minuten-20-die-ausgabe-mit-sevdesk/">Podcast-Episode</a> festgehalten habe.</p>
<p>Für den Jahreswechsel 2020/2021 habe ich mir vorgenommen einer neuen App eine Chance zu geben. <a href="https://taxfix.de/">TaxFix</a> heißt sie und vielleicht hört oder lest ihr dann im neuen Jahr, wie sich die Software geschlagen hat. Man soll die Hoffnung ja nicht aufgeben.</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/11/27/apps-fur-die-selbststandigkeit/">Apps für die Selbstständigkeit</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		
		
	</item>
		<item>
		<title>WordPress: Die Suche und Suchergebnisse optimieren</title>
		<link>https://macnotes.de/2021/05/06/wordpress-die-suche-und-suchergebnisse-optimieren/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Thu, 06 May 2021 11:28:26 +0000</pubDate>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Internet]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=560075</guid>

					<description><![CDATA[<p>Habt Ihr schon einmal das Gef&#252;hl gehabt, dass die WordPress-Suche unheimlich langsam ist? Dies kann viele Gr&#252;nde haben. Wir wollen Euch in diesem Artikel zweierlei zeigen: Einmal, wie Ihr die Suchergebnisse optimieren k&#246;nnt, beispielsweise indem Ihr sie optisch hervorhebt. Wir wollen Euch aber auch zeigen, wie Ihr die Suche deutlich beschleunigen k&#246;nnt, indem Ihr unn&#252;tze [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/05/06/wordpress-die-suche-und-suchergebnisse-optimieren/">WordPress: Die Suche und Suchergebnisse optimieren</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Habt Ihr schon einmal das Gef&uuml;hl gehabt, dass die WordPress-Suche unheimlich langsam ist? Dies kann viele Gr&uuml;nde haben. Wir wollen Euch in diesem Artikel zweierlei zeigen: Einmal, wie Ihr die Suchergebnisse optimieren k&ouml;nnt, beispielsweise indem Ihr sie optisch hervorhebt. Wir wollen Euch aber auch zeigen, wie Ihr die Suche deutlich beschleunigen k&ouml;nnt, indem Ihr unn&uuml;tze Abfragen aus der Suche entfernt.</p>
<h2>WordPress-Suche beschleunigen</h2>
</p>
<p>Derzeit entwickle ich f&uuml;r Macnotes ein neues Thema, das ausschlie&szlig;lich AMP nutzt, damit die Website f&uuml;r den Google-Bot, und andere sowohl auf dem Desktop als auch am Smartphone oder Tablet die gleichen Resultate liefert. Diese Konsistenz soll auf Dauer daf&uuml;r sorgen, dass ich &Auml;nderungen an der Website besser mit Erfolgen bei Google in Einklang bringen kann.</p>
<p>In meiner lokalen Entwicklungsumgebung ist mir neulich aufgefallen, wie langsam die Suche ist, und also habe ich mich daran begeben, die Ursache zu finden, und die Suche letzten Endes zu beschleunigen. Ein Plug-in, das Euch dabei behilflich sein kann, ist &bdquo;<a href="https://de.wordpress.org/plugins/query-monitor/">Query Monitor</a>&ldquo; von John Blackbourn. Ihr solltet es aber vor allem in Entwicklungsumgebungen einsetzen, weil es seinerseits einige Ressourcen nutzt und so die Seite selbst verlangsamen kann.</p>
<h3>Tablepress-Ergebnisse verlangsamen die Suche ungemein</h3>
<p>Query Monitor (QM) zeigt Euch unter anderem PHP-Fehler an, es f&auml;ngt aber auch die Datenbankabfragen ab und stellt fest, wie lange sie dauern. Ihr k&ouml;nnt auf diese Weise auch die Abfragen nachverfolgen und so &uuml;ber ein Datenbank-Tool wie <a href="https://apps.apple.com/us/app/sequel-ace/id1518036000?mt=12">Sequel Ace</a> noch einmal nachstellen.</p>
<p>Dabei habe ich zum Beispiel rausgefunden, dass WordPress mit installiertem Tablepress folgende Abfrage startet, wenn Ihr nach &bdquo;iphone 12&ldquo; sucht:</p>
<pre><code class="language-sql">SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND (((wp_posts.post_title LIKE '%iphone%')
OR (wp_posts.post_excerpt LIKE '%iphone%')
OR (wp_posts.post_content LIKE '%iphone%')
OR (wp_posts.post_content REGEXP '[table “” not found /]<br />
?)(9|10|11|13|14|44|45|50)([]"' /])'))
AND ((wp_posts.post_title LIKE '%12%')
OR (wp_posts.post_excerpt LIKE '%12%')
OR (wp_posts.post_content LIKE '%12%')
OR (wp_posts.post_content REGEXP '[table “” not found /]<br />
?)(1|2|3|5|7|10|11|13|14|17|19|20|21|23|30|32|39|41|43|44|47|50|51|55|57|58|59|60)([]"' /])')))
AND wp_posts.post_type IN ('post', 'page', 'attachment', 'buch', 'event', 'firma', 'person', 'plattform', 'produkt')
AND (wp_posts.post_status = 'publish')
ORDER BY (CASE
WHEN wp_posts.post_title LIKE '%iphone 12%'
THEN 1
WHEN wp_posts.post_title LIKE '%iphone%'
AND wp_posts.post_title LIKE '%12%'
THEN 2
WHEN wp_posts.post_title LIKE '%iphone%'
OR wp_posts.post_title LIKE '%12%'
THEN 3
WHEN wp_posts.post_excerpt LIKE '%iphone 12%'
THEN 4
WHEN wp_posts.post_content LIKE '%iphone 12%'
THEN 5
ELSE 6 END), wp_posts.post_date DESC
LIMIT 0, 10; 
</code></pre>
<p>Mal abgesehen von generell ziemlich vielen Zeilen, fallen sofort zwei ins Auge, n&auml;mlich die mit dem &bdquo;REGEXP&ldquo;. Das sind Suchabfragen, die explizit von Tablepress stammen.</p>
<p>Ja und dann habe ich einfach mal ausprobiert, wie lange die Suche mit und ohne diese Zeilen dauert. In der Entwicklungsumgebung waren das 13,7 Sekunden mit Tablepress-Ergebnissen versus 1,39 Sekunden ohne. Es w&uuml;rde zwar auf dem Webserver wegen mehr RAM und Ressourcen, etc. nicht derma&szlig;en auseinander driften, aber es ist trotzdem ein unn&ouml;tiger Ballast.</p>
<p>Denn ich nutze Tabellen nur innerhalb von Texten und in den Texten selber kommen die Suchw&ouml;rter &bdquo;hoffentlich&ldquo; auch vor. Also habe ich mich entschieden, WordPress nicht mehr die Tablepress-Tabellen zu durchsuchen.</p>
<p>Ihr f&uuml;gt dazu folgenden Befehl in die &bdquo;functions.php&ldquo; ein:</p>
<pre><code class="language-php">add_filter( 'tablepress_wp_search_integration', '__return_false' );
</code></pre>
<h3>Unn&ouml;tige Bestandteile entfernen</h3>
<p>Tablepress ist aber nicht das Einzige, das ich aus der Suche entferne. Ihr selbst k&ouml;nnt Euch &uuml;berlegen, welche Beitragstypen (Post Type) Bestandteil der Suche sein sollen. Wenn Ihr beispielsweise f&uuml;r einen &bdquo;Custom Post Type&ldquo; gar kein Archiv habt und stattdessen die Inhalte dahinter mehr wie in einem Glossar nutzt, kann es sich auch lohnen, diese aus der Suche zu entfernen.</p>
<p>Ebenfalls macht es in meinen Augen zum Beispiel keinen Sinn, die &bdquo;Attachments&ldquo; durchsuchen zu lassen. Ich nutze Bilder, PDFs oder Audiodateien und Videos ebenfalls innerhalb von Beitr&auml;gen, und entsprechend kann ich sie aus der Suche rausfiltern.</p>
<p>Das k&ouml;nnt Ihr wie folgt tun:</p>
<pre><code class="language-php"> add_action( 'init', 'sn_exclude_from_search_results' );
function sn_exclude_from_search_results() {
	global $wp_post_types;
	$wp_post_types['attachment']-&gt;exclude_from_search = true;
}
</code></pre>
<h2>Suchw&ouml;rter hervorheben</h2>
<p>Noch etwas finde ich pers&ouml;nlich sehr hilfreich, und zwar das optische Hervorheben von Suchw&ouml;rtern. So kann man den Kontext um das Gesuchte schneller in den Blick nehmen. Dazu ist nat&uuml;rlich ein bisschen CSS notwendig. Also f&uuml;ge ich entsprechend eine Klasse zu den Suchworten hinzu. Das klappt folgenderma&szlig;en:</p>
<pre><code class="language-php">function sn_highlight_title() {
  $title = get_the_title();
  $keys = implode('|', explode(' ', get_search_query()));
  $title = preg_replace('/(' . $keys .')/iu', '&lt;strong class="search-highlight"&gt;</code></pre>
<p>Der Beitrag <a href="https://macnotes.de/2021/05/06/wordpress-die-suche-und-suchergebnisse-optimieren/">WordPress: Die Suche und Suchergebnisse optimieren</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		
		
	</item>
		<item>
		<title>Sajonaras 7 Minuten #36: Linkpflege ist wichtig … #SEO</title>
		<link>https://macnotes.de/2021/04/13/sajonaras-7-minuten-36-linkpflege-ist-wichtig-seo/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Tue, 13 Apr 2021 01:10:28 +0000</pubDate>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Technologie]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=555244</guid>

					<description><![CDATA[<p>Als Betreiber einer Webseite ist die Linkpflege ein unliebsames Thema, das jedoch zur Kategorie des &#8222;technischen SEO&#8220; gez&#228;hlt wird. Sie ist notwendig, aber so was von. Genau diese Disziplin m&#246;chte ich in der aktuellen Ausgabe des Podcasts thematisieren. Der K&#246;lner Dom ist ein Gesamtkunstwerk, in den eigenen vier W&#228;nden gibt es immer etwas zu tun [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/04/13/sajonaras-7-minuten-36-linkpflege-ist-wichtig-seo/">Sajonaras 7 Minuten #36: Linkpflege ist wichtig … #SEO</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Als Betreiber einer Webseite ist die Linkpflege ein unliebsames Thema, das jedoch zur Kategorie des &bdquo;technischen SEO&ldquo; gez&auml;hlt wird. Sie ist notwendig, aber so was von. Genau diese Disziplin m&ouml;chte ich in der aktuellen Ausgabe des Podcasts thematisieren.</p>
<p>Der K&ouml;lner Dom ist ein Gesamtkunstwerk, in den eigenen vier W&auml;nden gibt es immer etwas zu tun und Linkpflege ist ein bisschen von beidem.</p>
<h2>Websitebetreiber, oder Papiertiger?</h2>
<p>Denn die eigene Webseite sollte jedem am Herzen liegen. Ich kenne Websitebetreiber, bei denen ist eine Website ein Papiertiger. Dort werden in B&uuml;ror&auml;umen Zahlen auf dem Papier jongliert, um am Ende zu entscheiden, worum es geht.</p>
<p>Ich kenne Leiter von Redaktionen, die sich f&uuml;r teures Geld vom Besitzer der Website einen SEO-Kurs haben bezahlen lassen, weil der es wollte und aber nicht besser wusste. Das sind diese Redaktionen, in den eigentlich niemand Ahnung davon hat, was eigentlich SEO ist, geschweige denn PHP, Ruby, Python oder einfach nur HTML und Javascript bedeuten. Dort wird f&uuml;r teures Geld Expertise von Au&szlig;en eingekauft und am Ende aber absolut nichts draus gemacht. So kann man sein Geld zum Fenster herauswerfen.</p>
<p>Doch es gibt auch diese Gruppe von Websitebetreibern, die zwar eine Ahnung davon haben, dass es irgendwie so was wie SEO gibt, aber es als zu m&uuml;hselig empfinden. SEO ist keine Alchemie und trotzdem ein weites Feld, das manche &uuml;berfordert und demotiviert.</p>
<h2>Linkpflege ist wichtig</h2>
<p><a href="https://macnotes.de/2020/05/23/wasserstand-13-lottogewinn-pr0n-092008-und-fake-anfragen/">Linkpflege</a> ist ein Teil der Suchmaschinenoptimierung. Dies ist nicht nur meine Meinung, sondern war schon Ende der 1990er meine Erfahrung. Damals wie heute mache ich mein Ding und versuche nicht, daraus irgendeinen Vorteil zu ziehen, au&szlig;er meinen eigenen. Will hei&szlig;en, ich gebe mich nicht als Suchmaschinenoptimierer aus, sondern ich wende meine Ideen an.</p>
<p>Es ist eine einfache Rechnung. Denn Google hat an vielen Stellen &uuml;ber das Thema gesprochen &ndash; damals noch Matt Cutts und sp&auml;ter &uuml;ber andere Verantwortliche Stellungnahmen abgegeben, um dies zu best&auml;tigen. Die Wartung einer Website ist wichtig. <a href="https://search.google.com/search-console/about">Googles Search Console</a> (fr&uuml;her Webmaster Tools) liefert Anreize, was man warten k&ouml;nnte.</p>
<p><a href="https://macnotes.de/2020/08/09/wasserstand-17-wordpress-bandigen-links-korrigieren-ruckschlage-verdauen/">Ich schrieb schon des &Ouml;fteren</a>, dass es ein Graus ist und man den Zerfall Woche f&uuml;r Woche erlebt. Ein Link, der vor Jahren noch aktiv war, funktioniert heute nicht mehr. Das w&auml;re noch verschmerzbar. Doch irgendwelche Idioten kaufen alte Domains auf und nutzen die Backlinks, um ihrer Pornoplattform, Casinodreck oder anderen sinnfreien Inhalten zu mehr Geltung zu verhelfen. Die Strategien werden immer subtiler. Doch sobald Google so eine Website erkennt, dann gilt sie als &bdquo;Bad Neighborhood&ldquo; und wirft ein schlechtes Licht auf die eigene Website. Welche Widrigkeiten die Linkpflege mit sich bringt, thematisiere ich im aktuellen Podcast von Macnotes.</p>
<p>Ach ja, und au&szlig;erdem gibt es vielleicht dort drau&szlig;en jemanden, der diesem Podcast zu einer Art Podcast verhelfen mag.</p>
<p>In jedem Fall findet Ihr unseren Podcast auf <a href="https://podcasts.apple.com/de/podcast/sajonaras-7-minuten/id824164708?l=de&at=1l3vbAb" rel="nofollow">iTunes</a>, <a href="https://open.spotify.com/show/4qnHdmYLstodgK0j3fmqf1">Spotify</a> und auch in <a href="https://podcasts.google.com/feed/aHR0cHM6Ly9tYWNub3Rlcy5kZS9wb2RjYXN0cy9zYWpvbmFyYXMtNy1taW51dGVuL2ZlZWQv">Googles Podcast-Verzeichnis</a>. Dort k&ouml;nnt Ihr ihn abonnieren, wenn Ihr m&ouml;gt.</p>
<audio class="wp-audio-shortcode" id="audio-555244-1" preload="none" style="width: 100%;" controls="controls"><source type="audio/mpeg" src="https://macnotes.de/images/2021/04/sajonara036.m4a?_=1" /><a href="https://macnotes.de/images/2021/04/sajonara036.m4a">https://macnotes.de/images/2021/04/sajonara036.m4a</a></audio>
<div class="inlinebox"><h4 class="notification is-warning has-text-dark is-marginless is-radiusless" style="padding:5;">Damit zeichnen wir unseren Podcast auf:</h4><div class="notification has-text-dark is-radiusless">Wer Lust hat, selbst auch einen Podcast aufzuzeichnen, dem wollen wir einen Blick auf unser Zubeh&ouml;r geben. Neben Apples GarageBand nutzen wir noch ein wenig Hardware, um unseren Podcast aufzuzeichnen. Wer sich selbst f&uuml;r die Podcast-Produktion interessiert, f&uuml;r den ist wom&ouml;glich folgende &Uuml;bersicht interessant:</p>
<ul>
<li><a href="https://www.amazon.de/R%C3%98DE-Go-Compact-Mikrofonsystem-kabellos/dp/B07QGGBNMN?tag=sajonara0d-21" rel="nofollow">R&Oslash;DE Wireless Go Compact Mikrofonsystem kabellos</a> (ca. 180 Euro).</li>
<li><a href="https://www.amazon.de/R%C3%98DE-Lavalier-Professionelles-tragbares-Mikrofon/dp/B07WM65GTF?tag=sajonara0d-21" rel="nofollow">R&Oslash;DE Lavalier GO Professionelles tragbares Mikrofon</a> (ca. 65 Euro).</li>
<li><a href="https://www.amazon.de/Rode-Anschlusskabel-Klinkenstecker-VideoMic-Smartphone-Rot/dp/B00L6C8T22?tag=sajonara0d-21" rel="nofollow">Rode Anschlusskabel auf Handy</a> (ca. 11 Euro).</li>
<li><a href="https://www.amazon.de/Creative-Sound-Blaster-Play-USB-DAC-Verst%C3%A4rker/dp/B073KTPNDR?tag=sajonara0d-21" rel="nofollow">Creative Sound Blaster Play!3 &#8211; USB-DAC-Verst&auml;rker und externe Soundkarte</a> (ca. 25 Euro).</li>
</ul>
<p></div></div>
<p><small>Dieser Artikel enthält Affiliate-Links.</small></p><p>Der Beitrag <a href="https://macnotes.de/2021/04/13/sajonaras-7-minuten-36-linkpflege-ist-wichtig-seo/">Sajonaras 7 Minuten #36: Linkpflege ist wichtig … #SEO</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://macnotes.de/images/2021/04/sajonara036.m4a" length="48262087" type="audio/mpeg" />

		
	</item>
		<item>
		<title>Sajonaras 7 Minuten #31: MS Edge am Mac</title>
		<link>https://macnotes.de/2021/03/23/sajonaras-7-minuten-31-ms-edge-am-mac/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Tue, 23 Mar 2021 02:33:14 +0000</pubDate>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=546122</guid>

					<description><![CDATA[<p>Vor einiger Zeit gab es ein Update f&#252;r Microsofts Browser Edge. Das enthielt &#8222;vertikale Tabs&#8220;. Grund genug, die Software noch einmal auszuprobieren. &#220;ber meine Erfahrungen damit spreche ich in der aktuellen Ausgabe unseres Podcasts. Ich bin ehrlich. Selbst als Mac-Nutzer verwende ich fast ausschlie&#223;lich Google Chrome. Safari ist schnell und schneller, aber ich konnte mich [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/03/23/sajonaras-7-minuten-31-ms-edge-am-mac/">Sajonaras 7 Minuten #31: MS Edge am Mac</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Vor einiger Zeit gab es ein Update f&uuml;r Microsofts Browser Edge. Das enthielt &bdquo;vertikale Tabs&ldquo;. Grund genug, die Software noch einmal auszuprobieren. &Uuml;ber meine Erfahrungen damit spreche ich in der aktuellen Ausgabe unseres Podcasts.</p>
<p>Ich bin ehrlich. Selbst als Mac-Nutzer verwende ich fast ausschlie&szlig;lich Google Chrome. Safari ist schnell und schneller, aber ich konnte mich noch nicht an die Feinheiten in der Benutzeroberfl&auml;che gew&ouml;hnen, dass ich &ouml;fter als nur &bdquo;manchmal&ldquo; damit arbeite.</p>
<p>Dazu kommt leider, dass Chrome deutlich robuster ist als Safari &ndash; nicht etwa, weil der Browser das Problem ist, sondern die vielen Webseiten dort drau&szlig;en. Selbst WordPress (und dessen Javascript) hat bis heute nicht richtig gelernt mit Safari zusammenzuarbeiten. Ich kenne Anwendungen im professionellen Umfeld, zur Verwaltung von Daten im Finanzbereich und solche, die in Hochschulen zur Kursverwaltung und f&uuml;r die Webseitenpflege als CMS eingesetzt wird, die zum Teil sehr gereizt reagiert, wenn man sie mit Safari am Desktop aufruft. Die Empfehlung lautet immer: Nutzen Sie bitte Chrome, Firefox oder einen anderen Browser.</p>
<h2>Auftritt Edge</h2>
<p>Wie w&auml;re es mit MS Edge? Denn dieser Browser basiert mittlerweile auch auf Chromium und der Wechsel f&auml;llt damit ziemlich einfach. Warum ich nun Wochen nach dem Test immer noch mit Microsofts Browser arbeite und aber trotzdem auch eine gewisse Entt&auml;uschung nicht verbergen kann, das erfahrt Ihr in dieser Ausgabe von Sajonaras 7 Minuten.</p>
<p>Diese und weitere findet Ihr auf <a href="https://podcasts.apple.com/de/podcast/sajonaras-7-minuten/id824164708?l=de&at=1l3vbAb" rel="nofollow">iTunes</a>, <a href="https://open.spotify.com/show/4qnHdmYLstodgK0j3fmqf1">Spotify</a> und auch in <a href="https://podcasts.google.com/feed/aHR0cHM6Ly9tYWNub3Rlcy5kZS9wb2RjYXN0cy9zYWpvbmFyYXMtNy1taW51dGVuL2ZlZWQv">Googles Podcast-Verzeichnis</a>. Dort k&ouml;nnt Ihr ihn abonnieren, wenn Ihr m&ouml;gt.</p>
<audio class="wp-audio-shortcode" id="audio-546122-3" preload="none" style="width: 100%;" controls="controls"><source type="audio/mpeg" src="https://macnotes.de/images/2021/03/sajonara031.m4a?_=3" /><a href="https://macnotes.de/images/2021/03/sajonara031.m4a">https://macnotes.de/images/2021/03/sajonara031.m4a</a></audio>
<div class="inlinebox"><h4 class="notification is-warning has-text-dark is-marginless is-radiusless" style="padding:5;">Damit zeichnen wir unseren Podcast auf:</h4><div class="notification has-text-dark is-radiusless">Wer Lust hat, selbst auch einen Podcast aufzuzeichnen, dem wollen wir einen Blick auf unser Zubeh&ouml;r geben. Neben Apples GarageBand nutzen wir noch ein wenig Hardware, um unseren Podcast aufzuzeichnen. Wer sich selbst f&uuml;r die Podcast-Produktion interessiert, f&uuml;r den ist wom&ouml;glich folgende &Uuml;bersicht interessant:</p>
<ul>
<li><a href="https://www.amazon.de/R%C3%98DE-Go-Compact-Mikrofonsystem-kabellos/dp/B07QGGBNMN?tag=sajonara0d-21" rel="nofollow">R&Oslash;DE Wireless Go Compact Mikrofonsystem kabellos</a> (ca. 180 Euro).</li>
<li><a href="https://www.amazon.de/R%C3%98DE-Lavalier-Professionelles-tragbares-Mikrofon/dp/B07WM65GTF?tag=sajonara0d-21" rel="nofollow">R&Oslash;DE Lavalier GO Professionelles tragbares Mikrofon</a> (ca. 65 Euro).</li>
<li><a href="https://www.amazon.de/Rode-Anschlusskabel-Klinkenstecker-VideoMic-Smartphone-Rot/dp/B00L6C8T22?tag=sajonara0d-21" rel="nofollow">Rode Anschlusskabel auf Handy</a> (ca. 11 Euro).</li>
<li><a href="https://www.amazon.de/Creative-Sound-Blaster-Play-USB-DAC-Verst%C3%A4rker/dp/B073KTPNDR?tag=sajonara0d-21" rel="nofollow">Creative Sound Blaster Play!3 &#8211; USB-DAC-Verst&auml;rker und externe Soundkarte</a> (ca. 25 Euro).</li>
</ul>
<p></div></div>
<p><small>Dieser Artikel enthält Affiliate-Links.</small></p><p>Der Beitrag <a href="https://macnotes.de/2021/03/23/sajonaras-7-minuten-31-ms-edge-am-mac/">Sajonaras 7 Minuten #31: MS Edge am Mac</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://macnotes.de/images/2021/03/sajonara031.m4a" length="30872258" type="audio/mpeg" />

		
	</item>
		<item>
		<title>Wie man bei der WordPress-Programmierung für Waffengleichheit sorgt</title>
		<link>https://macnotes.de/2021/03/15/wie-man-bei-der-wordpress-programmierung-fur-waffengleichheit-sorgt/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Mon, 15 Mar 2021 06:08:48 +0000</pubDate>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=524013</guid>

					<description><![CDATA[<p>Der Titel des Beitrags mag ein wenig kryptisch klingen, dahinter steckt aber eine konkrete Idee, die ich anders gerade nicht umschreiben kann. Die wird aber im Verlauf des Artikels klarer. Noch konkreter geht es um ein Beispiel aus der WordPress-Programmierung und damit um PHP. Allerdings sind diese Konzepte universell einsetzbar, sodass man sie auch in [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/03/15/wie-man-bei-der-wordpress-programmierung-fur-waffengleichheit-sorgt/">Wie man bei der WordPress-Programmierung für Waffengleichheit sorgt</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Der Titel des Beitrags mag ein wenig kryptisch klingen, dahinter steckt aber eine konkrete Idee, die ich anders gerade nicht umschreiben kann. Die wird aber im Verlauf des Artikels klarer. Noch konkreter geht es um ein Beispiel aus der WordPress-Programmierung und damit um PHP. Allerdings sind diese Konzepte universell einsetzbar, sodass man sie auch in anderen Programmiersprachen abbilden kann und natürlich auch außerhalb von WordPress.</p>
<h2>Worum geht es?</h2>
<p>Stellt Euch vor, Ihr habt eine Idee für eine Funktion oder am Ende des Tages sogar eine Klasse. Nehmen wir an, Ihr wollt eine Funktion programmieren, die Euch egal in welchem Kontext das passende Bild in Form eines Arrays mit Bildinformationen zurückgibt.</p>
<p>Die Funktion gibt Euch diese Bilddaten sowohl auf der Startseite, als auch in den Archiven und aber auch in einzelnen Beiträgen oder Seiten zurück und Ihr könntet Sie außerdem für viele andere Zwecke nutzen, in denen es immer um Bilder geht. Grob also in etwa:</p>
<pre><code>function my_img() {
…
return $img;
}
</code></pre>
<p>Normalerweise verzweifelt man irgendwann daran, dass es viel zu viele Ausnahmen gibt. Denn im Umfeld von WordPress gibt es diverse Funktionen, eine für Artikelbilder (<code>the_post_thumbnail()</code>), eine für Avatare, eine ganz andere, falls Bilder in Form von Metadaten an „Custom Post Types“ angehängt wurden (<code>get_post_meta()</code>), und so fort. Und wenn man die Bilder dann nicht im Rahmen des normalen „Loop“ von WordPress abgreift, sondern mit einem persönlichen Query, dann bekommt man es ohnehin mit einem anderen Ergebnis zu tun (<code>wp_get_attachment_img_src()</code>). Mal hat man dann mit Objekten zu tun, mal mit Arrays, mal mit bloßen Zeichenketten, in denen der URL des Bildes enthalten ist, aber nicht viel mehr.</p>
<p>Ist es nicht nervig, dass man dann überall einen anderen Ansatz für die Entwicklung des eigenen WordPress-Themes benötigt?</p>
<h2>Für Waffengleichheit sorgen</h2>
<p>Wie bekommt man all diese unterschiedlichen Ergebnisse sortiert? Ganz einfach. Indem man für Ordnung sorgt!</p>
<p>Die Absicht hinter einer eigenen Funktion oder sogar einer Klasse ist ja, dass man sie „immer gleich“ nutzen kann. Mithilfe von Parametern kann man dann noch entscheiden, welcher Code ausgegeben werden soll.</p>
<p>Im Laufe der Arbeit müsst Ihr dann einfach mal einen Schritt zurücktreten und schauen, wo überhaupt Gemeinsamkeiten bestehen. Eine WordPressfunktion wie <code>get_the_post_thumbnail()</code> liefert Euch am Ende des Tages einen fertigen HTML-Tag zurück. Für ein Bild, das als Metadaten zu einem Custom Post Type gespeichert wurde, erhaltet Ihr über <code>get_post_meta()</code> die URL zurück, aber keinen fertigen HTML-Tag. Über <code>wp_get_attachment_img_src()</code> gibt es ein Array, das neben der URL auch die Daten für Breite und Höhe enthält.</p>
<p>Wenn Ihr wollt, dass Ihr Eure Funktion immer auf die gleiche Art verwenden könnt, beispielsweise eine ID des Bildes angebt und dann aber ein Array mit URL, Breite und Höhe zurückbekommt, damit Ihr in Eurem Template dann den HTML-Tag selbst erstellen könnt, müsst Ihr einen gemeinsamen Nenner suchen.</p>
<p>Und was ist beispielsweise für den Fall, dass es gar kein Artikelbild gibt? Ja, auch dann müsst Ihr eben ein Array erstellen, das ein Standardbild als URL enthält, und Angaben für dessen Breite und Höhe.</p>
<p>So eine Funktion könnte unvollständigerweise wie folgt ausschauen:</p>
<pre><code>function my_img($id, $standort) {
	switch($standort) {
		case 'Startseite':
			$img = wp_get_attachment_src($id);
			$my_img = [
				'width' =&gt; $img[1],
				'height' =&gt; $img[2],
				'url' =&gt; $img[0]
			];
			break;
		case 'CPT':
			$img = get_post_meta(…);
			$my_img = [
				'width' =&gt; 1920,
				'height' =&gt; 1080,
				'url' =&gt; $img
			];
	}
	// für den Fall, dass noch gar kein Bild-Array erstellt wurde, müssen wir noch eines hinzufügen.

	if(!isset($my_img)) {
		$my_img = [
			'width' = 1920,
			'height' = 1080,
			'url' = 'Adresse zum Standardbild'
		];
	}
	return $my_img;
} 
</code></pre>
<p>Der obige Code ist nicht auf Fehler geprüft, da ich gerade nur einen Texteditor zur Hand habe. Aber mir kam eben gerade jetzt die Idee zu diesem Artikel.</p>
<p>Die Funktion liefert Euch also theoretisch „in jedem Fall“ ein Array mit URL, Breite und Höhe zurück. Auf diese Weise könnt Ihr sie dann immer auf die gleiche Weise verwenden.</p>
<h3>Nicht dem Chaos nachgeben</h3>
<p>Denn es passiert viel zu schnell, dass man sich mit einer Situation zufriedengibt, in der man sagt, ach komm, an dieser Stelle geht es nun mal nicht, weil da hab ich keine ID vom Bild, sondern nur eine vom Kommentar, und brauche aber den Avatar. Ja, genau dann muss man vorab für Waffengleichheit sorgen.</p>
<p>Das kann man entweder „vorher“, also außerhalb der Funktion. Das ist zu begrüßen. Denn eine Funktion sollte tatsächlich nur eine Aufgabe haben und die immer gleich ausführen. Man könnte es theoretisch auch innerhalb der Funktion, aber das würde die Funktion unnötig aufblähen.</p>
<p>Wenn man also eine ID von einem Kommentar hat und aber die ID des zugehörigen Avatar-Bildes benötigt, muss man im Vorfeld erst mit den vorhandenen Daten diese ID rausfinden. Auch dafür könnte man wieder eine eigene Funktion erstellen, wenn es nicht womöglich auch schon eine bei WordPress gibt. Da ist dann im Fall von WordPress <a href="https://developer.wordpress.org/reference/">die Code Reference</a> eine gute Anlaufstelle.</p>
<p>Ich habe persönlich eine Weile gebraucht, bis ich vor Jahren irgendwann gemerkt habe, dass es mir hilft, wenn ich in meinen Funktionen für Waffengleichheit sorge, statt ständig neuen Code zu schreiben, oder aber dutzende Ausnahmen zu schaffen.</p>
<p>Denn wenn Ihr wisst, dass Ihr die Funktion <code>my_img()</code> verwendet und immer auf die gleiche Weise verwenden könnt, habt Ihr beim Durchsehen des Quellcodes wesentlich mehr Überblick und ärgert Euch nicht, dass WordPress in dem Kontext mal so programmiert werden will und in einer anderen Situation aber anders. Ihr könnt dann ruhigen Gewissens Eure Vorlagen entwerfen und müsst nur einmal auf die Animositäten von WordPress Rücksicht nehmen, aber eben nicht immer wieder aufs Neue.</p>
<p>Ihr schafft dann einmal „Ordnung“ und könnt Euch immer darauf verlassen, dass Ihr ein korrektes Ergebnis erhaltet, mit dem Ihr arbeiten könnt.</p>
<h3>Weitere Beispiele</h3>
<p>Die thematisierte Bild-Funktion ist nur ein Beispiel von vielen.</p>
<p>Ich reduziere, wenn ich mit WordPress arbeite, mittlerweile meine Abfragen auf ein Minimum. So kann man eine QUERY nur IDs als Ergebnis zurückgeben lassen, statt vollständige Artikel samt aller Metadaten. Ich bekomme dann ein Array mit IDs zurück und kann es überall sinnvoll einsetzen, egal ob auf der Startseite, in Archiven, oder wo immer ich es möchte.</p>
<p>Statt womöglich mehrere Male einen QUERY zum Beispiel im Template für die Startseite zu nutzen, habe ich mir einfach eine eigene <code>my_query()</code>-Funktion geschrieben. Auch die hat den Vorteil, dass ich immer weiß, was ich am Ende bekomme. Ich kann mittels Parameter den QUERY auf Artikel einer anderen Kategorie steuern. Aber ich kann auch Fälle berücksichtigen, in denen ich vielleicht ähnliche Artikel über Metadaten abfragen möchte. All das kann ich vorab einrichten, sodass ich am Ende bei <code>my_guery()</code> immer die IDs von Artikeln erhalte, mit denen ich weiterarbeiten kann.</p>
<h3>Was geht rein, was soll raus</h3>
<p>„Früher“ &#8482; hab ich eigentlich nie darüber nachgedacht, was ich mit Funktionen erreichen möchte. Also grob schon, aber nie im Detail.</p>
<p>Vor Jahren war der Anspruch eigentlich, ein wenig Arbeit zu erleichtern. Das ist er heute zwar immer noch. Doch wenn man sich darauf besinnt, zu prüfen, welche Daten in eine Funktion hineingehen und welche am Ende herauskommen, kann man sogar noch weitere Optimierungen vornehmen.</p>
<h4>Zu viele Parameter sind ein „Zeichen“!</h4>
<p>Wenn ich beispielsweise merke, dass ich noch einen, und noch einen Parameter brauche und am Ende eine Funktion habe, die zwar alles tut, was sie soll, aber ich womöglich 10, 12 unterschiedliche Parameter brauchen könnte, dann ist das auch nicht im Sinne des Erfinders. Dann ist es eher Zeit, sich vor Augen zu führen, dass ich mit weiteren Funktionen besser bedient bin, um am Ende wieder den Normalzustand herzustellen.</p>
<p>Will heißen: Wenn ich sage, in eine Funktion gehen IDs von Bildern rein und kommen Arrays mit Bildinformationen raus, dann sollte ich diese Funktion nicht damit belasten, aus möglicherweise Artikel-IDs noch Bild-IDs zu extrahieren. Für derartige Fälle kann ich mir lieber einfallen lassen, eine <code>get_my_img_ID()</code>-Funktion zu schreiben, die mir die benötigte Bild-ID liefert, mit der ich meine <code>my_img()</code>-Funktion füttern kann.</p>
<h4>Eine Zeichenkette ist eine Zeichenkette, ist eine Zeichenkette?</h4>
<p>An dieser Stelle möchte ich zum Ausklang noch ein etwas anderes Beispiel aufführen. Vielleicht kennen manche von Euch die WordPress-Funktion <code>wp_remote_get()</code>, wenn nicht, dann könnt Ihr dessen Funktionsweise in der Code Reference von WordPress <a href="https://developer.wordpress.org/reference/functions/wp_remote_get/">nachlesen</a>.</p>
<p>Die Funktion liefert ein Array zurück, das neben den Verbindungsdaten aus dem „Header“ auch den „Body“, also die eigentliche Webseite als Zeichenkette zurückgibt. Wenn Ihr aber am Ende des Tages etwas Anderes benötigt, oder nur Teile davon, dann könnt Ihr natürlich auch hier für Waffengleichheit sorgen, indem Ihr mit einer Funktion das Ergebnis bearbeitet, bis es Euren Bedürfnissen entspricht. Ich habe diese Funktion auch mal verwendet, um URLs von Bildern zu erhalten. Natürlich musste ich dann den Quellcode entsprechend „parsen“.</p>
<h4>Einen hab ich noch …</h4>
<p>Daran anschließen möchte ich noch einen Hinweis, der prima zum Stichwort Parsen passt. Es gibt ein mächtiges Werkzeug zum Parsen von Dokumenten, das sind die regulären Ausdrücke. Damit kann man tolle Sachen machen, allerdings benötigen reguläre Ausdrücke (REGEX) auch eine gewisse Einarbeitungszeit.</p>
<p>Doch wenn Ihr spontan tatsächlich gewisse „Elemente“ einer HTML-Seite extrahieren oder bearbeiten möchtet, sagen wir alle Bilder, oder alle Links, dann eignet sich dafür auch <a href="https://www.php.net/manual/de/class.domdocument.php">die PHP-Klasse DOMDocument</a> relativ gut. Wer schon mal mit Javascript programmiert hat, der wird diese Klasse zu schätzen wissen. Denn sie bietet ähnliche Angriffspunkte wie das auch in Javascript genutzte „Document Object Model“ (DOM) und ist aus diesem Grund leichter zugänglich als reguläre Ausdrücke.</p>
<p>Ihr sucht nach einem Anwendungszweck? Ihr könntet mit Javascript, unter manchen Umständen auch mit CSS, gewisse Links kennzeichnen. Aber wenn der Nutzer Javascript ausschaltet, dann ist auch die Kennzeichnung futsch und mit CSS seid Ihr nicht so flexibel. Also könntet Ihr dann den <code>$content</code> von WordPress mit DOMDocument bearbeiten. Damit Ihr am Ende aber nicht weiteren HTML-Tags oder unnötigen Ballast erhaltet, gibt es mittlerweile in PHP passende Parameter, um das zu unterbinden. Für die Funktion „loadHTML“ gibt es nämlich mittlerweile die Parameter <code>LIBXML_HTML_NOIMPLIED</code> und <code>LIBXML_HTML_NODEFDTD</code>. <a href="https://www.php.net/manual/en/libxml.constants.php">Mehr dazu</a> findet Ihr in der PHP-Dokumentation.</p>
<pre><code>function manipulate_my_content() {
	global $post
	$content = $post-&gt;post_content;
	$document = new DOMDocument();
	$document-&gt;loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
	// links extrahieren oder dergleichen geht dann ganz einfach mit:
	$links = $document-&gt;getElementsByTagName('a');
	// irgendwas mit den Links anfangen
	…
	// den manipulierten Inhalt speichern und wieder zurückgeben
	return $document-&gt;saveHTML();
}
</code></pre>
<p>Diese Ansätze, die ich in dem Beitrag erwähnt habe, helfen mir dabei, Waffengleichheit zu erzielen, und mich bei der Arbeit mit WordPress ein wenig voranzubringen.</p>
<p>Vielleicht helfen Sie Euch ja ebenso. Interessant findet Ihr dann womöglich auch die Beiträge:</p>
<ul>
<li>„<a href="https://macnotes.de/2021/01/24/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-1/">Von der Idee zum WordPress-Plug-in #1</a>“ und</li>
<li>„<a href="https://macnotes.de/2021/01/26/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-2/">Von der Idee zum WordPress-Plug-in #2“</a>.</li>
</ul>
<p>Der Beitrag <a href="https://macnotes.de/2021/03/15/wie-man-bei-der-wordpress-programmierung-fur-waffengleichheit-sorgt/">Wie man bei der WordPress-Programmierung für Waffengleichheit sorgt</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		
		
	</item>
		<item>
		<title>MAMP (PRO) und WordPress: Internal Server Error (500) beheben</title>
		<link>https://macnotes.de/2021/02/23/mamp-pro-und-wordpress-internal-server-error-500-beheben/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Tue, 23 Feb 2021 13:20:27 +0000</pubDate>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Internet]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=524077</guid>

					<description><![CDATA[<p>F&#252;r Rails-Apps habe ich in der Vergangenheit oft Container-Software genutzt, aber zur PHP-Webentwicklung setze ich schon seit vielen Jahren auf MAMP (PRO). Nun begegnete mir heute wiederholt der &#8222;Internal Server Error&#8220; mit dem Fehlercode 500. Das kann viele Ursachen haben, aber eine in Verbindung mit WordPress, die sich unkompliziert beheben l&#228;sst. Wie behebt man den [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/02/23/mamp-pro-und-wordpress-internal-server-error-500-beheben/">MAMP (PRO) und WordPress: Internal Server Error (500) beheben</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>F&uuml;r Rails-Apps habe ich in der Vergangenheit oft Container-Software genutzt, aber zur PHP-Webentwicklung setze ich schon seit vielen Jahren auf MAMP (PRO). Nun begegnete mir heute wiederholt der &bdquo;Internal Server Error&ldquo; mit dem Fehlercode 500. Das kann viele Ursachen haben, aber eine in Verbindung mit WordPress, die sich unkompliziert beheben l&auml;sst.</p>
<h2>Wie behebt man den Fehler 500 bei WordPress und MAMP?</h2>
<p>WordPress l&auml;sst sich oft bitten. Habt Ihr gerade eine WordPress-Umgebung umgezogen, oder habt Ihr &Auml;nderungen an der <code>wp-config.php</code> vorgenommen, dann kann es Euch passieren, dass beim Aufruf einer Webseite auf einmal nichts mehr geht.</p>
<div data-id="524076" class="ajaxGalleryInit" style="display:none;"></div>
<p>Mir ist dieser Fehler nun nach einigen Jahren erneut untergekommen, und statt mir gemerkt zu haben, wie ich ihn behebe, musste ich selbst erst einmal wieder recherchieren. Doch die angebotenen L&ouml;sungen waren alle viel zu komplex. Man sollte virtuelle Hosts manipulieren, Einstellungen in den Konfigurationsdateien vornehmen und den Server neu starten. Irgendwann d&auml;mmerte es mir aber, und ich erinnerte mich.</p>
<h3>WP-Admin funktioniert, Webseite aber nicht: Permalinks sind schuld</h3>
<p>Tats&auml;chlich konnte ich mich ohne Weiteres im &bdquo;Backend&ldquo; anmelden, aber eben keine Einzelseite aufrufen, wurde dann immer mit dem Fehler 500 konfrontiert.</p>
<p>In diesem konkreten Fall hilft das &Ouml;ffnen der Einstellungen von WordPress. Navigiert dort zum Punkt &bdquo;Permalinks&ldquo; und klickt einfach einmal auf &bdquo;&Auml;nderungen speichern&ldquo;. Et voil&agrave;. Es geht wieder.</p>
<p>Diese Vorgehensweise hilft nat&uuml;rlich nur, wenn nichts &Auml;rgeres im Hintergrund nicht so will, wie es soll. Denn es kann auch andere Gr&uuml;nde geben, wieso man diese Fehlermeldung angezeigt bekommt.</p>
<h3>Sich an das Problem herantasten</h3>
<p>Als Nutzer von MAMP Pro kann man beispielsweise in der PHP-Konfiguration einfach ein H&auml;kchen setzen, um PHP-Fehler auch auf dem Monitor auszugeben. Nutzt man nur MAMP ohne Pro, dann kann man in den Kopf der eigenen Vorlage (meist <code>header.php</code>) folgende Zeilen Code hinzuf&uuml;gen:</p>
<pre><code>// PHP-Fehler ausgeben
   ini_set('display_errors', 1);
   ini_set('display_startup_errors', 1);
   error_reporting(E_ALL);
</code></pre>
<p>Aber genau an diesem Punkt wurde ich stutzig. Denn es kam erst gar nicht zur Ausgabe und tats&auml;chlich hatte ich die Konfiguration von WordPress erst ver&auml;ndert, da ich einen neuen Host f&uuml;r die Installation eingerichtet hatte.</p></p>
<p>Der Beitrag <a href="https://macnotes.de/2021/02/23/mamp-pro-und-wordpress-internal-server-error-500-beheben/">MAMP (PRO) und WordPress: Internal Server Error (500) beheben</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		
		
	</item>
		<item>
		<title>Sajonaras 7 Minuten #16: Von der Idee zum WordPress-Plug-in</title>
		<link>https://macnotes.de/2021/02/04/sajonaras-7-minuten-16-von-der-idee-zum-wordpress-plug-in/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Thu, 04 Feb 2021 00:17:33 +0000</pubDate>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=520885</guid>

					<description><![CDATA[<p>Es ist wieder so weit. Wir ver&#246;ffentlichen eine weitere Ausgabe von unserem Podcast Sajonaras 7 Minuten. Thema der heutigen Ausgabe sind meine Erlebnisse der letzten Wochen, die mich ganz sch&#246;n auf Trab gehalten haben, und bei denen ich von blo&#223;en Ideen zur Entwicklung eigener WordPress-Plug-ins kam. Stammleser der Webseite wissen es schon, aber hier ist [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/02/04/sajonaras-7-minuten-16-von-der-idee-zum-wordpress-plug-in/">Sajonaras 7 Minuten #16: Von der Idee zum WordPress-Plug-in</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Es ist wieder so weit. Wir ver&ouml;ffentlichen eine weitere Ausgabe von unserem Podcast Sajonaras 7 Minuten. Thema der heutigen Ausgabe sind meine Erlebnisse der letzten Wochen, die mich ganz sch&ouml;n auf Trab gehalten haben, und bei denen ich von blo&szlig;en Ideen zur Entwicklung eigener WordPress-Plug-ins kam.</p>
<p>Stammleser der Webseite wissen es schon, aber hier ist momentan wieder etwas weniger los. Das hing zuletzt auch damit zusammen, dass ich statt zu schreiben wieder mehr programmiert habe. Denn letztlich habe ich ein &bdquo;gro&szlig;e Ziel&ldquo; im Blick, das ich ja <a href="https://macnotes.de/2019/11/01/nahkastchen-19-da-bin-ich-wieder/">im November 2019</a> schon ank&uuml;ndigte, aber sp&auml;ter dann auch <a href="https://macnotes.de/2020/02/07/wasserstand-4-cebit-2008-und-richtungsweisende-entscheidung/">in einigen Wasserst&auml;nden</a> erl&auml;uterte.</p>
<p>Irgendwann will ich mit Macnotes auf ein eigenes System wechseln und gerne mehr datengest&uuml;tzten Journalismus betreiben. Die Informationen sollen mir und Euch, aber in Zukunft auch anderen Autoren dabei helfen, nicht nur Artikelideen zu entwickeln, sondern auch Fakten zu recherchieren, ohne dabei grunds&auml;tzlich zu externen Quellen greifen zu m&uuml;ssen. Letztlich ist n&auml;mlich auch ein eigenes Archiv, und k&ouml;nnen eigene Datenbanken ein Fundus f&uuml;r Informationen sein.</p>
<h2>Macnotes auf eine gemeinsame Datenbasis heben</h2>
<p>Doch damit wir &uuml;berhaupt so weit kommen, m&uuml;ssen die vorhandenen Artikel auf eine gemeinsame Datenbasis kommen. Daran arbeite ich &ndash; immer noch und auch noch eine ganze Weile. Letztlich ist Macnotes n&auml;mlich mittlerweile bald 40.000 Texte schwer und die stammen aus teilweise ganz unterschiedlichen Webseiten und &Uuml;bernahmen von Webseiten.</p>
<h2>Von der Idee zum WordPress-Plug-in</h2>
<p>Wer sich im Detail f&uuml;r die im Podcast angesprochenen Texte interessiert, dem verlinke ich sie gerne: von der Idee zum WordPress-Plug-in <a href="https://macnotes.de/2021/01/24/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-1/">#1</a> und <a href="https://macnotes.de/2021/01/26/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-2/">#2</a>.</p>
<p>Ihr k&ouml;nnt in den kommenden Wochen und Monaten auch mit weiteren Beitr&auml;gen zur Plug-in-Entwicklung f&uuml;r WordPress rechnen, die neben der Kommunikation mit der Datenbank auch Hinweise auf die Entwicklung einer eigenen API umfassen. Letztlich ist das Thema einfach zu spannend, um nicht dar&uuml;ber zu schreiben.</p>
<audio class="wp-audio-shortcode" id="audio-520885-5" preload="none" style="width: 100%;" controls="controls"><source type="audio/mpeg" src="https://macnotes.de/images/2021/02/sajonara016.m4a?_=5" /><a href="https://macnotes.de/images/2021/02/sajonara016.m4a">https://macnotes.de/images/2021/02/sajonara016.m4a</a></audio>
<p>Ja, und dann folgt wieder der &uuml;bliche Hinweis, dass Ihr den Podcast sowohl <a href="https://podcasts.apple.com/de/podcast/sajonaras-7-minuten/id824164708?l=de&at=1l3vbAb" rel="nofollow">auf iTunes</a> als auch <a href="https://open.spotify.com/show/4qnHdmYLstodgK0j3fmqf1">auf Spotify</a> abonnieren k&ouml;nnt.</p>
<p><small>Dieser Artikel enthält Affiliate-Links.</small></p><p>Der Beitrag <a href="https://macnotes.de/2021/02/04/sajonaras-7-minuten-16-von-der-idee-zum-wordpress-plug-in/">Sajonaras 7 Minuten #16: Von der Idee zum WordPress-Plug-in</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://macnotes.de/images/2021/02/sajonara016.m4a" length="13364694" type="audio/mpeg" />

		
	</item>
		<item>
		<title>Von der Idee zum WordPress-Plug-in: Schlagwörter automatisch hinzufügen #2</title>
		<link>https://macnotes.de/2021/01/26/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-2/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Tue, 26 Jan 2021 00:33:34 +0000</pubDate>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=516259</guid>

					<description><![CDATA[<p>In Teil 1 von der Idee zum WordPress-Plug-in beschrieb ich bereits umfassend die Beweggründe, wie man von ein paar Zeilen Code für eine regelmäßig wiederkehrende Aufgabe am Ende des Tages zu einem ausgewachsenen Plug-in kam. Der vorherige Text wies außerdem bereits fertigen, funktionierenden Quellcode auf, mit dem man von Hand ohne Weiteres hätte arbeiten können. [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/01/26/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-2/">Von der Idee zum WordPress-Plug-in: Schlagwörter automatisch hinzufügen #2</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'><a href="https://macnotes.de/2021/01/24/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-1/">In Teil 1 von der Idee zum WordPress-Plug-in</a> beschrieb ich bereits umfassend die Beweggründe, wie man von ein paar Zeilen Code für eine regelmäßig wiederkehrende Aufgabe am Ende des Tages zu einem ausgewachsenen Plug-in kam. Der vorherige Text wies außerdem bereits fertigen, funktionierenden Quellcode auf, mit dem man von Hand ohne Weiteres hätte arbeiten können. Doch was wäre ein Plug-in ohne Komfort. Für Komfort dient die Eingabe vom Nutzer, und die speichert man am besten in der Datenbank ab.</p>
<p>Genau das wollen wir Euch dann in dieser Ausgabe erklären, und auch, welche Grenzen unser Plug-in weiterhin hat. Die Herangehensweise zeigt vor allem, dass so ein relativ einfaches Projekt mit ein wenig Fantasie und Aufwand zu etwas richtig seriösem aufgebaut werden kann.</p>
<h2>Das Plug-in braucht mehr Komfort</h2>
<p>Anstatt den Quellcode immer von Hand anzupassen, wenn man neue Schlagwörter hinzufügen möchte, kann man dazu die Datenbank bei WordPress verwenden und entsprechende Formulare. Folgende „Details“ und „Fragen“ gibt es unter anderem zu klären, von denen wir aber nur einige exemplarisch nennen wollen:</p>
<ul>
<li>Wie kann ich mit der Datenbank von WordPress kommunizieren?</li>
<li>Benötige ich eine eigene Tabelle?</li>
<li>Wie handhabt WordPress Formulare?</li>
<li>Gibt es Sicherheitsvorkehrungen zu treffen?</li>
<li>Muss ich mehrere Plug-in-Dateien erstellen?</li>
<li>Was ist die WordPress-Nonce, und wie kann sie mir in diesem Fall helfen?</li>
</ul>
<h2>Wann benötige ich für mein Plug-in eine eigene Tabelle?</h2>
<p>Es ist eine <a href="https://wordpress.stackexchange.com/questions/53932/is-it-bad-practice-to-create-own-table-for-a-plugin">viel diskutierte Frage</a>, ob es sinnvoll sein kann, eine eigene Tabelle für ein WordPress-Plug-in einzurichten. Eines der Schwergewichte unter den WordPress-Plug-ins, Yoast SEO, änderte vor ein paar Monaten seine Einstellung zu der Thematik und migriert seitdem mit jedem Update zunehmend mehr Daten aus WordPress-Tabellen in eigene.</p>
<p>Für mich liegt die Antwort auf der Hand: Ich mache immer eine eigene Tabelle, wenn ich eigene Daten verwenden möchte. Sieht man davon ab, dass WordPress-Tabellen vor allem bei großen Websites sowieso relativ unübersichtlich werden, kann es beim Abfragen von Daten auch Performance-Vorteile bieten. In der Tat ergibt es aber nur wenig Sinn, den Aufwand zu betreiben, wenn man am Ende nur eine Handvoll Datensätze speichern mag. Die lassen sich zur Not auch noch in der WordPress-Tabelle sichern.</p>
<h2>Wie kommuniziere ich mit der WordPress-Datenbank?</h2>
<p>WordPress hält für Entwickler Befehle zur Verfügung, um mit der Datenbank zu kommunizieren. In Einzelfällen kann es sinnvoll sein, die WordPress-Routinen zu umgehen und mittels PHP oder anderer Scriptsprachen die Kommunikation zur Datenbank auf eigene Faust zu unternehmen. Das ist aber nur in Fällen ratsam, in denen man wirklich viele Datensätze bearbeitet, und an dieser Stelle rede ich von zehntausenden Datensätzen und mehr, die regelmäßig immer wieder abgefragt werden oder aktualisiert werden. Denn zur Wahrheit gehört, <a href="https://macnotes.de/2020/01/16/wie-wordpress-das-web-verstopft-google-fonts-gutenberg-und-mehr/">dass die WordPress-Datenbank-Engine nicht die schnellste ist</a>.</p>
<p>In Teil 1 wiesen wir bereits auf Befehle wie <code>add_option()</code> (vgl. <a href="https://developer.wordpress.org/reference/functions/add_option/">WordPress Code-Referenz</a>) hin, mit dem sich Daten ohne Weiteres in die Tabelle <code>wp_options</code> von WordPress hinzufügen lassen. Mittels <code>update_option()</code> kann man vorhandene Datensätze aktualisieren, und sie mit <code>delete_option()</code> entsprechend wieder entfernen.</p>
<p>Doch wir wollen nicht die WordPress-Tabelle zumüllen, sondern mit der eigenen Tabelle kommunizieren. Diese funktioniert über die <code>wpdb</code>-Schnittstelle.</p>
<h3>Eigene Tabelle für WordPress erstellen</h3>
<p>Klar kann man die Tabelle für das eigene Plug-in auch von Hand erstellen, über phpMyAdmin oder eine andere Software, auch am Desktop-Computer. Wer sich auskennt, kann dazu auch einfach die mysql-Schnittstelle auf dem Server mittels Terminal verwenden. Doch bei einem Plug-in geht es ja um die Wiederverwendbarkeit und die Möglichkeit, dass auch andere Nutzer damit arbeiten können.</p>
<p>Entsprechend nutzen wir die WordPress-eigenen Mittel, um die Tabelle zu erstellen. Der beste Zeitpunkt dafür ist übrigens beim „Aktivieren“ des Plug-ins. Wie im ersten Teil dieses Tutorials schon beschrieben, trennt WordPress zwischen dem Aktivieren, Deaktivieren und Deinstallieren. Dafür gibt es extra drei passende „Auslöser“, die wir uns zunutze machen können.</p>
<p>In unserem Fall benötigen wir eine Tabelle, die lediglich drei Reihen umfasst, eine fortlaufende Nummerierung (ID), eine Suchphrase (searchstring) und ein Schlagwort (keywordstring). Um in mySQL eine Tabelle mit dieser Struktur einzurichten, benötigt man folgenden Code:</p>
<pre><code>CREATE TABLE XYZ (
		id mediumint(9) NOT NULL AUTO_INCREMENT,
		searchstring varchar(25) NOT NULL,
		keywordstring varchar(25) NOT NULL,
		UNIQUE KEY id (id),
	    UNIQUE KEY searchstring (searchstring)
	) ZEICHENSATZ;
</code></pre>
<p>Wir müssen der Tabelle noch einen Namen geben und auch einen Zeichensatz angeben. Da aber durch die Installation von WordPress je nach Konfiguration von WordPress ein Zeichensatz genutzt wird, und wir uns nicht den Kopf darüber zerbrechen wollen, welcher das ist, verwenden wir einfach <code>$wpdb-&gt;get_charset_collate()</code> (vgl. <a href="https://developer.wordpress.org/reference/classes/wpdb/get_charset_collate/">WordPress Code-Referenz</a>), um den Zeichensatz abzufragen.</p>
<p>Ja, und auch bei der Namensgebung für die Tabelle, wollen wir uns zumindest an die Gepflogenheiten halten und greifen daher auf das Präfix zurück, das WordPress uns anbietet, und Nutzer bei der Installation individuell einrichten können (<code>$wpdb-&gt;prefix</code>). Unsere Tabelle nennen wir dann noch <code>sn_add_keywords</code>, die entsprechend mit dem Präfix von WP ausgestattet wird.</p>
<h3>Tabelle bei Plug-in-Aktivierung einrichten</h3>
<p>Nun gehen wir davon aus, dass wir die Tabelle beim Aktivieren des Plug-ins einrichten möchten. Wir greifen dazu also auf den <code>register_activation_hook()</code> (vgl. <a href="https://developer.wordpress.org/reference/functions/register_activation_hook/">WordPress Code-Referenz</a>) zurück.</p>
<p>Dieser Aufruf hat zwei Parameter. Der erste nennt den Dateinamen des Plug-ins inklusive Pfadangabe. Dafür gibt es glücklicherweise eine Konstante namens <code>__FILE__</code>, die uns die Arbeit erleichtert, wenn wir uns an die Konventionen halten und unser Plug-in auch im Plug-in-Verzeichnis unterbringen. Der zweite Parameter ruft eine Funktion auf, die dann zum Zeitpunkt der Aktivierung des Plug-ins aktiv wird.</p>
<p>Wir erstellen also eine Funktion, die uns die Tabelle erstellt. Die sieht wie folgt aus:</p>
<pre><code>function sn_add_keywords_create_database() {
  global $wpdb;
  $charset_collate = $wpdb-&gt;get_charset_collate();
  $table_name = $wpdb-&gt;prefix . 'sn_add_keywords';

  $sql = "CREATE TABLE $table_name (
		id mediumint(9) NOT NULL AUTO_INCREMENT,
		searchstring varchar(25) NOT NULL,
		keywordstring varchar(25) NOT NULL,
		UNIQUE KEY id (id),
    UNIQUE KEY searchstring (searchstring)
	) $charset_collate;";

	require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
	dbDelta( $sql );
}
</code></pre>
<p>Die rufen wir dann mit dem passenden Auslöser auf:</p>
<pre><code>register_activation_hook(__FILE__, 'sn_add_keywords_create_database');
</code></pre>
<h3>Tabelle bei der Deinstallation löschen</h3>
<p>Man könnte die Tabelle theoretisch auch beim Deaktivieren schon löschen. Aber das erachten wir für nicht sinnvoll. Bei der Deinstallation eines Plug-ins sollte man aber sehr wohl darauf achten, hinter sich sauberzumachen. Wir setzen in dem Fall den <code>register_uninstall_hook()</code> ein. Der funktioniert analog zum Aktivierungsauslöser und hat die gleichen beiden Parameter. Wir erstellen also eine Funktion, die die Datenbank löscht:</p>
<pre><code>function sn_add_keywords_remove_database() {
  global $wpdb;
  $table_name = $wpdb-&gt;prefix . 'sn_add_keywords';
  $sql = "DROP TABLE IF EXISTS $table_name";
  $wpdb-&gt;query($sql);
}
</code></pre>
<p>Diese rufen wir dann mit dem Auslöser wie folgt auf:</p>
<pre><code>register_uninstall_hook(__FILE__, 'sn_add_keywords_remove_database');
</code></pre>
<h2>Wie kommuniziert unser Plug-in mit der Datenbank?</h2>
<p>Wie man mittels WordPress-Funktionen mit der Datenbank kommuniziert, haben wir schon angeschnitten. Aber damit unser Plug-in, das ebenfalls kann, benötigt es ein Formular.</p>
<p>Zudem können wir an dieser Stelle noch ein paar Sicherheitsvorkehrungen treffen. Anders als bei einem Formular zur Anmeldung beim Newsletter, wollen wir vermutlich nur Personen Schlagworte hinzufügen lassen, denen wir vertrauen. Auch müssen wir sicherstellen, dass in der Datenbank nichts „Bösartiges“ gespeichert wird. Aus diesem Grund nutzen wir die wordpress-eigenen Befehle für die Datenbankkommunikation, weil manche von ihnen bereits Sicherheitsmechanismen enthalten, und wir so ein bisschen beruhigter sein können. Doch, der Reihe nach.</p>
<h3>Formular für die Datenbankeingabe erstellen</h3>
<p>An dieser Stelle kann man ohne Umschweife zunächst einmal ein einfaches Formular in HTML erstellen. Wir benötigen zwei Eingabefelder für Text, eventuell noch zwei Etiketten und einen Button (oder Link) zum Absenden des Formulars. Der Einfachheit halber – weil es funktioniert, und um schnell erste Ergebnisse zu erhalten – verwenden wir keine spezielle Aktion zum Auslösen, und nutzen die <code>POST</code>-Methode.</p>
<p>Unser HTML-Formular sieht wie folgt aus:</p>
<pre><code>&lt;form method="POST"&gt;
	&lt;?php wp_nonce_field('sn_add_keywords', 'sn_add_keywords_nonce', true, true); ?&gt;
    &lt;h2&gt;Neuen Eintrag hinzufügen:&lt;/h2&gt;
    &lt;label for="searchstring"&gt;Searchstring:&lt;/label&gt;
    &lt;input type="text" id="searchstring" name="searchstring" required&gt;
    &lt;label for="keywordstring"&gt;Keywordstring:&lt;/label&gt;
    &lt;input type="text" id="keywordstring" name="keywordstring" required&gt;
	&lt;?php submit_button('Hinzufügen'); ?&gt;
&lt;/form&gt;
</code></pre>
<p>Die <code>submit_button()</code>-Funktion stellt WordPress zur Verfügung. In Klammern übergeben wir die Beschriftung für den Button. Der Button erhält dann auch die typischen Klassen, damit er mittels CSS automatisch in der für WordPress typischen Kolorierung und Form erscheint. Wer das individuelle handhaben mag, kann natürlich einen eigenen Button erstellen.</p>
<h3>Was ist dieses Nonce, und wieso brauche ich sie?</h3>
<p>Im obersten Feld des Formulars erkennt Ihr den Befehl <code>wp_nonce_field()</code>, den WordPress ebenfalls zur Verfügung stellt. Die „Nonce“ (vgl. <a href="https://de.wikipedia.org/wiki/Nonce">Wikipedia</a>) ist eine flüchtige Phrase, die zum Zwecke der Authentifizierung erstellt wird.</p>
<p>WordPress bietet dieses System ebenfalls an. Es ist sehr hilfreich, wenn man die Kommunikation mit der Datenbank nur authentifizierten Nutzern zu ermöglichen. Denn die Nonce wird beim Aufruf erzeugt und ist dann nur in der Session des Nutzers gültig. Würde jemand, der gar nicht mit WordPress eingeloggt ist, versuchen die Funktion auszuführen, scheiterte die Kommunikation daran, dass er nicht die korrekte „Nonce“ dafür hat.</p>
<p>Wir werden dann die erstellte Nonce noch überprüfen, bevor wir tatsächlich in die Datenbank schreiben.</p>
<h3>Formular-Daten in die Datenbank schreiben</h3>
<p>Nun müssen wir uns also noch darum kümmern, die im Formular eingegebenen Daten beim Klick auf den Button in die Datenbank zu speichern. Wie machen wir das?</p>
<p>Zum einen haben wir ja geschrieben, dass die Daten mittels POST-Methode übergeben werden. Sie sind dann entsprechend über die <a href="https://www.php.net/manual/de/reserved.variables.post.php">POST-Variablen</a> auslesbar. Mit dem Nonce-Field erzeugt WordPress aber noch ein unsichtbares Feld mit dem Authentifizierungstoken. Auch der ist dann als POST-Variable abfragbar und lässt sich so vergleichen.</p>
<p>Für das Schreiben in die Datenbank, kann man entweder ein eigenes QUERY and <code>$wpdb</code> übergeben, oder wir nutzen den von WordPress implementierten <code>$wpdb-&gt;insert()</code>-Befehl.</p>
<pre><code>if(is_admin() &amp;&amp; (isset($_POST['sn_add_keywords_nonce']) || wp_verify_nonce($_POST['sn_add_keywords_nonce'], 'sn_add_keywords'))) {
	global $wpdb;
	$table_name = $wpdb-&gt;prefix . 'sn_add_keywords';
	$newdata = array(
        'searchstring' =&gt; sanitize_text_field($_POST['searchstring']),
        'keywordstring' =&gt; sanitize_text_field($_POST['keywordstring']),
      );
    $wpdb-&gt;insert($table_name, $newdata, '%s');
    wp_safe_redirect(esc_url(admin_url('admin.php?page=sn_add_keywords%2Fsnak.php')));
}
exit();
</code></pre>
<p>Über den Befehl <code>wp_safe_redirect()</code> leiten wir nach dem Absenden den Benutzer wieder zurück zur Ausgangsseite. Diese Vorgehensweise hat übrigens einen Nachteil, den wir in Kauf nehmen, der aber für ein frei verfügbares Plug-in ausgebessert werden sollte, zum Beispiel, indem man AJAX verwendet.</p>
<p>Zuletzt stellen wir über den <code>exit()</code>-Befehl sicher, dass wirklich alle POST-Variablen nach dem Abschluss gelöscht werden. So wird das Formular geleert und auch eine neue Nonce erstellt.</p>
<p>Das Plug-in, wie wir es verwenden sieht bei uns dann übrigens derzeit so aus.</p>
<div data-id="516258" class="ajaxGalleryInit" style="display:none;"></div>
<h2>Was wir nicht erzählt haben?</h2>
<p>Auch dieser Beitrag ist schon wieder ziemlich lang geworden. Deshalb haben wir einige Details geschlabbert. Darunter:</p>
<ul>
<li>Denn in unserem Plug-in haben wir beispielsweise bei der Aktivierung auch eine Versionsnummer übergeben. Die können wir dann bei einem Update vergleichen und nutzen, um so Änderungen an der Datenbank vorzunehmen.</li>
<li>Wir haben aber auch unterschlagen, dass wir unsere Tabelle beim Aktivieren bereits mit ein paar Datensätzen ausgestattet haben. Ich finde es immer schöner, wenn man zumindest ein paar Anhaltspunkte hat.</li>
<li>Es kann außerdem sinnvoll sein, die Daten nicht zu löschen, oder dies dem Nutzer zur Wahl zu stellen. Um so eine Option haben wir uns bislang nicht gekümmert.</li>
<li>WordPress hält auch Alternativen zu den „Auslösern“ bereit. So kann man Dateien namens <code>uninstall.php</code> oder <code>activation.php</code> erstellen. Deren Inhalte werden dann automatisch ausgeführt.</li>
<li>Wie Ihr auf dem Screenshot erkennen könnt, geben wir die vorhandenen Datensätze auch im WordPress-Administrationsportal aus. Wie wir das gemacht haben, haben wir an dieser Stelle ebenso geschlabbert.</li>
<li>Nicht thematisiert haben wir den Prozess, wie man ein Plug-in bei WordPress einreicht. Vielleicht kommt das in einem anderen Beitrag einmal zur Sprache, oder Ihr findet es bis dahin selbst heraus.</li>
<li>Spannend ist auch, wie man bereits vorhandene Daten wieder löscht, oder überarbeitet.</li>
<li>Der Quellcode hier enthält auch kein CSS und gibt ganz grundsätzlich nicht das komplette Plug-in wieder, wie wir es verwenden. Zum Zwecke des Tutorials habe ich diesen angepasst, damit er allgemein verständlicher wird.</li>
</ul>
<p>Tatsächlich ist diese „Idee“, aus der erst eine Handvoll Quellcode wurde, in unserem Fall mittlerweile auf fünf Dateien mit rund 250 Zeilen Quellcode angewachsen (Kommentare inklusive).</p>
<p>Wenn jemand von Euch Fragen zu diesem Projekt hat, kann er uns gerne auf den üblichen Kanälen anschreiben.</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/01/26/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-2/">Von der Idee zum WordPress-Plug-in: Schlagwörter automatisch hinzufügen #2</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		
		
	</item>
		<item>
		<title>Von der Idee zum WordPress-Plug-in: Schlagwörter automatisch hinzufügen #1</title>
		<link>https://macnotes.de/2021/01/24/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-1/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Sun, 24 Jan 2021 07:45:03 +0000</pubDate>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=515582</guid>

					<description><![CDATA[<p>Wer immer schon mal wissen wollte, wie man ein eigenes WordPress-Plug-in anfertigt, für den ist der nachfolgende Beitrag mit Sicherheit interessant. Denn bei uns war die Idee, Schlagwörter automatisch hinzuzufügen, damit wir bei der Überarbeitung der Artikel am Ende noch weniger Arbeit damit haben. Was aber als Bastelei am eigenen WordPress-Theme anfing und nur ein [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/01/24/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-1/">Von der Idee zum WordPress-Plug-in: Schlagwörter automatisch hinzufügen #1</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Wer immer schon mal wissen wollte, wie man ein eigenes WordPress-Plug-in anfertigt, für den ist der nachfolgende Beitrag mit Sicherheit interessant. Denn bei uns war die Idee, Schlagwörter automatisch hinzuzufügen, damit wir bei der Überarbeitung der Artikel am Ende noch weniger Arbeit damit haben. Was aber als Bastelei am eigenen WordPress-Theme anfing und nur ein paar Zeilen Quellcode im Footer ausmachte, endete schließlich als ausgewachsenes Plug-in.</p>
<p>Warum? Es wäre zu einfach, zu sagen, weil wir es können. Es gibt viel einleuchtendere Gründe:</p>
<ul>
<li>Weil diese Aufgabe so oft ausgeführt wird, dass sich der Aufwand lohnt.</li>
<li>Da wir nicht ständig den Quellcode anpassen wollten, um wieder eine Option hinzuzufügen, sondern dies unmittelbar erledigen zu können.</li>
<li>Weil es durchaus Spaß macht, je öfter man sich einer Herausforderung stellt und man am Ende sogar noch etwas lernt.</li>
<li>Da ein Plug-in am Ende wartungsfreundlicher ist, und auch unabhängig von einem Thema genutzt werden kann.</li>
<li>Weil das Plug-in vielleicht sogar so interessant ist, dass man es anderen Leuten zur Verfügung stellen kann, die das gleiche Problem lösen wollen.</li>
</ul>
<h2>Automatisierung tut not</h2>
<p>Regelmäßige Macnotes-Leser wissen, dass wir im Hintergrund versuchen, trotz WordPress eine Datenbasis aufzubauen, mit der wir irgendwann dann den nächsten Schritt wagen können. Bis dahin wird es aber noch eine Weile dauern. <a href="https://macnotes.de/2021/01/08/wasserstand-19-neue-funktionen-2020-geschafft-2009-auch/">Anfang Januar erwähnte ich im Wasserstand #19</a>, dass wir bei der Überarbeitung das Jahr 2009 abgeschlossen haben. Mittlerweile bin ich sogar schon beim Februar 2010 angelangt.</p>
<p>Doch diese Überarbeitung ist so langwierig, und vor allem so repetitiv. Immer, wenn Aufgaben sich wiederholen, lohnt es sich, nach einer Automatisierung derselben zu suchen.</p>
<h2>Die Idee: Schlagwörter automatisch hinzufügen</h2>
<p>Wenn ich schreibe Schlagwörter, dann meine ich eigentlich sogar einen eigenen Typus, der bei uns intern „Keywords“ genannt wird. Wir haben zusätzlich zu den öffentlichen Schlagwörtern, für die es auch Archive gibt, nämlich interner Schlüsselwörter im Einsatz, die nicht für Nutzer und Suchmaschinen einsehbar sind, die uns aber erlauben, semantische Filter an manchen Stellen auf der Webseite einzusetzen, beispielsweise wenn es darum geht, „ähnliche Artikel“ anzuzeigen.</p>
<p>Nun ist die Situation, die ich bei Macnotes vorfand aber unbefriedigend. Denn es gab und gibt auch immer noch mehr als zehntausend öffentlich sichtbare Schlagwörter. Ich gehe bei der Überarbeitung chronologisch vor, Artikel für Artikel, da wir über die Jahre mehr als ein halbes Dutzend Webseiten (Macnotes, iPhone-Notes, Apfelmagazin, Blog4i, u. a. m.) zusammengeführt haben. Es gab inhaltlich doppelte Beiträge, die müssen zusammengeführt werden, und neu verlinkt. Ich könnte auch mit der Dampfhammer-Methode alle Beiträge und deren Schlagworte automatisch anpassen oder löschen. Nur dann fehlten mir auf einen Schlag zehntausende Endpunkt für Google. Stattdessen arbeite ich diese Stück für Stück ab und füge dann auch Weiterleitungen hinzu, damit die Suchmaschine nicht ganz im Dunkeln tappt.</p>
<h3>Wie kann man die Idee umsetzen?</h3>
<p>Wenn ich in den vielen Jahren Computerei etwas gelernt habe, dann, dass es nicht schadet, sich die eigene Idee einmal vor Augen zu führen.</p>
<p>Gerade Laien bekommen so ein besseres Gefühl dafür, was alles zu tun ist. In der Informatikausbildung nennt man solchen Output gerne auch mal Pseudocode. Strukturierte Notizen reichen aber vollkommen aus, um dann die einzelnen Teile auszuarbeiten.</p>
<p>Wenn ich also Schlagworte automatisch ersetzen will, dann muss ich mir Gedanken machen, darüber …</p>
<ul>
<li>… wann das geschehen soll,</li>
<li>… welche Schlagwörter das sein sollen,</li>
<li>… womit ich sie vergleichen kann, um zu entscheiden, ob sie automatisch hinzugefügt werden.</li>
</ul>
<p>Ich könnte mir noch mehr Fragen stellen. Aber ungefähr so beginnt dann ein Brainstorming und kann man versuchen, Antworten zu finden.</p>
<h3>1. Schritt: direkt im Artikel</h3>
<p>Meine erste Idee war, ich könnte, „wenn ich als Administrator eingeloggt bin“, und nur dann, eine Funktion aufrufen, die dann die Schlagwörter hinzufügt.</p>
<p>Ich gehe dann gerne hin, und füge in der Datei <code>footer.php</code> ersten Quellcode hinzu und erzeuge eine Ausgabe. Natürlich mache ich das nicht live auf Macnotes, sondern in meiner Entwicklungsumgebung am heimischen Computer. Ich setze für die WordPress-Entwicklung gerne <a href="https://www.mamp.info/de/mac/">MAMP</a> ein. Das hat sich bewährt und ist relativ pflegeleicht (funktioniert auch unter macOS Big Sur und auf Apple Silicon).</p>
<p>Da ich gerade einen Artikel überarbeitete, stoppte ich die Arbeit daran und dachte. Dieser kann als Startpunkt für die Funktion dienen. Also suchte ich nach einem Merkmal, das relativ eindeutig zuordenbar ist. Im Titel sehr vieler „Notizen“-Beiträge auf Macnotes kommt die Phrase „Notizen vom“ vor. Wenn ich 1000 Mal in Zukunft so ein Schlagwort automatisch hinzufüge, und vielleicht zwei, dreimal daneben liege, dann ist es einfacher, dreimal das Schlagwort wieder zu entfernen.</p>
<h4>Überschrift mit Phrase vergleichen, Ergebnis als Arbeitsauftrag</h4>
<p>Also verglich ich im Quellcode den Inhalt vom Titel mit der Phrase „Notizen vom“ und gab dann etwas aus. Die Notiz würde in etwa lauten:</p>
<pre><code>Wenn der Titel "Notizen vom" enthält, dann füge das Keyword "Notizen (MN)" hinzu, aber nur, wenn es noch nicht vorhanden ist.
</code></pre>
<p>Ja und dann kann man sich bereits an die Arbeit machen. Wer noch Laie ist, der kann anhand dieser Anweisung auch Google oder eine andere Suchmaschine bemühen, beispielsweise danach, wie man an den „Titel“ eines Beitrags in WordPress gelangt, oder wie man in PHP innerhalb einer Zeichenkette (String) nach einer Phrase (Substring) sucht. So kommt man dann von A nach B und hangelt sich immer weiter.</p>
<p>Wer schon mehr Erfahrung hat, wird Anlaufstellen kennen, oder eben direkt losprogrammieren. Der erste Code sieht dann in etwa wie folgt aus:</p>
<pre><code>if(strpos($post-&gt;post_title, 'Notizen vom') !== false) {
 echo 'An dieser Stelle muss dann die Funktion arbeiten.';
}
</code></pre>
<p>Die PHP-Funktion <a href="https://www.php.net/manual/de/function.strpos.php">strpos</a> wird gerne verwendet, um eine Gelingensbedingung zu erzeugen. Sie liefert entweder eine Zahl zurück, oder <code>false</code>, wenn die gesuchte Zeichenkette nicht vorhanden ist. Das ist prima, denn uns interessiert nur, ob es vorkommt. Also müssen wir umgekehrt fragen, ob beim Vergleich mit dem Titel „nicht false“ zurückgegeben wird.</p>
<h4>Überprüfen, ob das Schlagwort vorhanden ist</h4>
<p>Nun müssen wir noch überprüfen, ob der Beitrag nicht eventuell schon das Keyword „Notizen (MN)“ nutzt. WordPress bietet dazu bereits eine Funktion an namens <code>has_term()</code> (vgl. <a href="https://developer.wordpress.org/reference/functions/has_term/">WordPress Code-Referenz</a>).</p>
<p>Wir fügen also dem Code von oben noch etwas hinzu:</p>
<pre><code>if(strpos($post-&gt;post_title, 'Notizen vom') !== false) {
	if(has_term('Notizen (MN)') {
	echo 'es gibt das Keyword schon.';
} else {
	echo 'jetzt müssen wir das Schlagwort hinzufügen.';
}
}
</code></pre>
<h4>Schlagwort hinzufügen</h4>
<p>Wir müssen uns nun also Gedanken machen, wie wir das Schlagwort an der Stelle hinzufügen. Auch dafür bietet WordPress eine Methode an: <code>wp_set_post_terms()</code> (vgl. <a href="https://developer.wordpress.org/reference/functions/wp_set_post_terms/">WordPress Code-Referenz</a>).</p>
<p>Abermals passen wir dann den Code von oben weiter an.</p>
<pre><code>if(strpos($post-&gt;post_title, 'Notizen vom') !== false) {
	if(has_term('Notizen (MN)') {
	echo 'es gibt das Keyword schon.';
} else {
	wp_set_post_terms($post-&gt;ID, 'Notizen (MN)', 'keywords', true);
	echo 'wir haben das Schlagwort hinzugefügt.';
}
}
</code></pre>
<h2>2. Schritt: Abstrahieren nicht vergessen</h2>
<p>Jetzt haben wir doch alles erreicht, was wir wollten, und können uns wieder anderen Dingen zuwenden?</p>
<p>Nicht ganz. Denn wir wollen ja zum Beispiel auch zwei oder mehr Schlagworte anpassen. Zunächst bedeutet das, dass wir den Code von oben weiter umbauen müssen. Doch zunächst sollten wir uns wieder ein paar Gedanken darüber machen, wie man das machen kann.</p>
<p>Der unmittelbarste Zugang wäre vermutlich, denn Quellcode einfach zu kopieren, und einfach nur die Vergleichsphrase im Titel zu finden und dazu das passende Schlagwort. Aber man kann das auch eleganter lösen:</p>
<pre><code>Übergebe ein Array mit allen möglichen Schlagworten. Vergleiche und ersetze für alle diese.
</code></pre>
<p>Also dann ans Werk. Aus einem Schlagwort hab ich kurzerhand erst einmal zwei gemacht, und diese zu einem Array (<code>$tags[]</code>) hinzugefügt. Dann muss ich natürlich noch eine Funktion suchen, die mir erlaubt, für jedes Element im Array etwas auszuführen. Da hält PHP dann die <a href="https://www.php.net/manual/de/control-structures.foreach.php">foreach-Schleife</a> bereit.</p>
<pre><code>$tags = [
	"Notizen vom" =&gt; "Notizen (MN)",
	"Windows 7" =&gt; "Windows 7"
  ];
  foreach ($tags as $title =&gt; $keyword) {
    if(strpos($post-&gt;post_title, $title) !== false){
      if ( has_term($keyword, 'keywords') ) {
        echo ( '&lt;p&gt;Es gibt das Keyword "'.$keyword.'" schon.&lt;/p&gt;' );
      } else {
        wp_set_post_terms( $post-&gt;ID, $keyword, 'keywords', true );
        echo ( '&lt;p&gt;Wir haben das Keyword "'.$keyword.'" hinzugefügt.');
      }
    }
  }
</code></pre>
<h2>3. Schritt: Noch weiter abstrahieren, Plug-in entsteht</h2>
<p>Das letzte Stück Quellcode war doch eigentlich ganz prima? Ja, ich hätte einfach in der Footer-Datei bei neuen Schlagworten, die mir einfallen, diese ergänzen können, die Datei auf den Server hochladen, und weiterarbeiten können.</p>
<p>Aber auch das ist nur ein fauler Kompromiss. Denn viel besser wäre es ja, wenn man direkt in WordPress beliebig viele Schlagworte hinzufügen könnte, die man auf diese Weise ergänzen wollte.</p>
<h3>Vorüberlegungen</h3>
<p>An dieser Stelle lohnt es abermals, ein paar Vorüberlegungen zu machen. Fragen, die man sich stellen kann, lauten:</p>
<ul>
<li>Wie kann ich die Daten getrennt vom Code bearbeiten?</li>
<li>Welche Möglichkeiten habe ich, um mit Daten zu interagieren?</li>
</ul>
<p>Auch das sind nur zwei von vielen Fragen, mit denen man sich an der Stelle beschäftigen könnte. Mir ist zum Beispiel in den Sinn gekommen, eine Text-Datei oder eine CSV-Datei zu nutzen, um darüber die Daten zu ergänzen. Aber dann hätte ich auch das Problem, diese immer wieder zu ergänzen, und hochladen zu müssen.</p>
<p>Als Nächstes fällt einem dann eine Tabelle ein. WordPress nutzt MySQL und bietet sogar Funktionen, um sowohl Tabellen zu erstellen, als auch Daten darin zu ändern.</p>
<p>Nur dann benötige ich ja irgendeine Möglichkeit, die Daten online hinzuzufügen. Ich könnte natürlich eine separate HTML/PHP-Seite erstellen, die ich aufrufe, und der ich es erlaube, mit der Datenbank zu kommunizieren. An dieser Stelle reifte dann der Gedanke, dass ich auch gleich ein Plug-in für WordPress entwickeln könnte. Das hat nämlich auch den Vorteil, dass ich die Funktionalität nicht verliere, sollte ich mal das Theme für Macnotes anpassen.</p>
<h3>WordPress-Plug-ins erstellen, aber wie?</h3>
<p>Ich hatte vor Jahren schon mal ein Plug-in für WordPress erstellt. Aber wie das eben so ist, wenn man sich nicht so sehr mit der Materie auseinandersetzt, dann muss man sich erst wieder einarbeiten. Eine Anlaufstelle ist natürlich <a href="https://developer.wordpress.org/plugins/intro/">WordPress’ eigenes Handbuch</a> für die Plug-in-Entwicklung. Das ist aber so strukturiert, dass man viel hin- und hernavigiert und mit sehr vielen komplexen Dingen konfrontiert wird.</p>
<p>Einfacher geht es, wenn man in der Suchmaschine seines Vertrauens nach Alternativen Ausschau hält. Das können auch teilweise sehr alte Beiträge von <a href="https://www.smashingmagazine.com/2011/09/how-to-create-a-wordpress-plugin/">Smashing Magazine</a> (9+ Jahre) oder von <a href="https://bueltge.de/wp-tutorial-wir-schreiben-ein-simples-wp-plugin-teil-0/">Frank Bültge</a> (14+ Jahre) sein. Selbst wenn manche der Hinweise darin heute nicht mehr aktuell sein „sollten“, dann bekommt man nämlich Anhaltspunkte, wie die Dinge zusammenpassen und kann sich von dort aus weiterhangeln.</p>
<h3>Was braucht man für ein WordPress-Plug-in?</h3>
<p>Das einfachste WordPress-Plug-in, das man herstellen kann, besteht aus einer einzelnen Datei, die man einfach in das Plug-in-Verzeichnis von WordPress kopiert (besser aber in einen Unterordner). „So einfach“ ist das tatsächlich.</p>
<p>Diese Plug-in-Datei enthält im Kopf ein paar Kommentare, die WordPress dann ausliest und in der Administrationsoberfläche anzeigt.</p>
<pre><code>/**
* Plugin Name: SN Add Keywords
* Plugin URI: https://sajonara.info
* Description: This plugin automatically adds keywords to the database, if they are found in the headline and not already implemented.
* Version: 0.0.2
* Author: Alexander Trust
* Author URI: https://sajonara.info
* License: GPL2
*/
</code></pre>
<p>Eine PHP-Datei, die nur diese Information enthält und sonst nichts, ist auf dem Papier auch schon ein „nutzloses“ Plug-in. WordPress zeigt es dann an, und man kann es aktivieren.</p>
<div data-id="515581" class="ajaxGalleryInit" style="display:none;"></div>
<h4>Plug-ins wollen aufgerufen werden</h4>
<p>Angenommen, wir hätten den bereits fertigen Quellcode von davor in unsere Plug-in-Datei kopiert, hätte auch dieser funktioniert, WordPress beim Aktivieren allerdings eine Fehlermeldung ausgegeben. Das liegt nicht zuletzt daran, dass WordPress gerne möchte, dass Plug-ins und deren Funktionen „aufgerufen“ werden sollen.</p>
<p>Dazu stellt WordPress zwei Kategorien an Aufrufen zur Verfügung:</p>
<ul>
<li>Hooks</li>
<li>Filter</li>
</ul>
<p>Die Filter sollen vor allem dazu genutzt werden, um Inhalte zu verändern. Entsprechend gibt es für Filter (<code>add_filter()</code>) Parameter, die beispielsweise den Titel (<code>the_title</code>) oder den Text (<code>the_content</code>) betreffen. Es gibt noch viele weitere Endpunkte, an denen man einen Filter ausführen könnte.</p>
<p>Doch wir wollen ja nicht den Text verändern, sondern Schlagworte hinzufügen, und also sind die „Hooks“ (<code>add_hook()</code>) vielleicht eher für unsere Zwecke geeignet.</p>
<p>Was wir dann also machen können, um WordPress zufriedenzustellen, ist unseren Code von davor in eine Funktion integrieren, und diese mittels eines Action-Hooks aufzurufen.</p>
<pre><code>add_action('wp_footer', 'sn_add_keywords');

function sn_add_keywords() {
 /* Unser Quellcode von zuvor. */
}
</code></pre>
<h4>Drei Zustände eines Plug-ins</h4>
<p>WordPress erkennt insgesamt drei Zustände eines Plug-ins, und kann, beim Eintreten derselben aktiv werden.</p>
<ul>
<li>Beim Aktivieren,</li>
<li>beim Deaktivieren</li>
<li>und beim Deinstallieren.</li>
</ul>
<p>Warum erzähle ich Euch das? Nun, weil es durchaus hilfreich sein kann, nicht nur an sich selbst zu denken, sondern auch an andere. Und an dieser Stelle erreicht dann die ursprüngliche Idee bereits eine interessante Komplexität.</p>
<p>Ich sagte ja, es wäre prima, wenn man eine Tabelle hätte, in die man dann die Schlagwörter hinzufügen kann. Das Aktivieren des Plug-ins eignet sich in diesem Fall dazu, die Tabelle anzulegen. Auch dafür hält WordPress dann Befehle bereit.</p>
<p>Ich finde aber, dass dieser Beitrag schon lang genug geworden ist, und habe mich deshalb dazu entschieden, noch einen zweiten Teil herauszubringen, in dem ich dann erkläre, wie man die Tabelle anlegt, sie mit ersten Daten füllt, und wieso es hilfreich sein kann, die Versionsnummer des eigenen Plug-ins ebenfalls in der Datenbank von WordPress zu speichern. Außerdem widme ich mich dann auch den anderen beiden Zuständen von Plug-ins. Nicht zuletzt wollt Ihr ja sicherstellen, dass Euer Plug-in, wenn man es deinstalliert, die Daten ordentlich löscht. Und über das Erstellen einer „Webseite“ für das Plug-in in der Administrationsoberfläche von WordPress haben wir auch noch nicht gesprochen.</p>
<p>Freut Euch also dann auf den zweiten Teil, der vermutlich nicht ewig auf sich warten lassen wird.</p>
<p>Der Beitrag <a href="https://macnotes.de/2021/01/24/von-der-idee-zum-wordpress-plug-in-schlagworter-automatisch-hinzufugen-1/">Von der Idee zum WordPress-Plug-in: Schlagwörter automatisch hinzufügen #1</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		
		
	</item>
		<item>
		<title>Webador im Test: Websites erstellen mit dem Baukasten, geht das?</title>
		<link>https://macnotes.de/2020/12/02/webador-im-test-websites-erstellen-mit-dem-baukasten-geht-das/</link>
		
		<dc:creator><![CDATA[Alexander Trust]]></dc:creator>
		<pubDate>Wed, 02 Dec 2020 13:36:21 +0000</pubDate>
				<category><![CDATA[Review]]></category>
		<category><![CDATA[Internet]]></category>
		<guid isPermaLink="false">https://macnotes.de/?p=477385</guid>

					<description><![CDATA[<p>Mit Webador gibt es einen Homepage-Baukasten, der auch Bestandteile f&#252;r eigene Onlineshops bereith&#228;lt. F&#252;r manche Leute stellt eine solche Plattform den ersten Weg ins Netz dar. Wir haben uns einmal angesehen, was man damit alles anstellen kann. Immer mal wieder gibt es Gelegenheiten, sich selbst und die eigenen Vorurteile zu hinterfragen. In den 1990ern &#8222;programmierte&#8220; [&#8230;]</p>
<p>Der Beitrag <a href="https://macnotes.de/2020/12/02/webador-im-test-websites-erstellen-mit-dem-baukasten-geht-das/">Webador im Test: Websites erstellen mit dem Baukasten, geht das?</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class='lead'>Mit Webador gibt es einen Homepage-Baukasten, der auch Bestandteile f&uuml;r eigene Onlineshops bereith&auml;lt. F&uuml;r manche Leute stellt eine solche Plattform den ersten Weg ins Netz dar. Wir haben uns einmal angesehen, was man damit alles anstellen kann.</p>
<p>Immer mal wieder gibt es Gelegenheiten, sich selbst und die eigenen Vorurteile zu hinterfragen. In den 1990ern &bdquo;programmierte&ldquo; ich bereits eigene Webseiten, zuletzt half ich einem Kunden bei der Migration von Joomla zu WordPress. Auf Macnotes nutzen wir derzeit selbst noch <a href="https://wordpress.org/">WordPress</a>, programmieren aber <a href="https://www.raywenderlich.com/1323930-vapor-vs-kitura-choosing-a-server-side-swift-framework">mit Server-Side-Swift</a> ein eigene Version der Webseite f&uuml;r die mittelfristige Zukunft, nicht zuletzt weil wir <a href="https://macnotes.de/2020/01/16/wie-wordpress-das-web-verstopft-google-fonts-gutenberg-und-mehr/">mit WordPress aus diversen Gr&uuml;nden nicht zufrieden</a> sind. Es liegt also auf den ersten Blick ziemlich fern, sich die sogenannte &bdquo;Homepage von der Stange&ldquo; anzusehen.</p>
<h2>Erste Webador Erfahrungen</h2>
<p>Aber gerade deswegen sollte man es vielleicht trotzdem tun. Ich hatte nun jedenfalls die Gelegenheit mir den Webador Homepage-Baukasten anzusehen und konnte damit eine <a href="https://www.webador.de/">Website erstellen</a>.</p>
<h3>Homepage kostenlos erstellen</h3>
<p>Der Anbieter aus den Niederlanden hat vor kurzem sein Gesch&auml;ft erweitert und bietet nun auch Kunden in Deutschland seine Dienstleistungen an, samt deutschsprachigem Support, sogar kostenlos.</p>
<p>Das hei&szlig;t jedenfalls jeder kann zun&auml;chst einmal gratis eine eigene Webseite erstellen. Die ist dann &uuml;ber eine Webador-Adresse im Netz erreichbar. Wer eine eigene Domain anbinden will, kann das auch tun. Mehr dazu sp&auml;ter.</p>
<h3>Drei Klicks zum ersten Erfolg</h3>
<p>Zun&auml;chst einmal w&auml;hlt man aus, welche Art von Homepage man haben m&ouml;chte: Website, Webshop oder Blog. Wer beispielsweise eine Adresse im Internet f&uuml;r seinen Handwerksbetrieb oder seine Arztpraxis sucht, und sich aber nicht mit der Technik auseinandersetzen m&ouml;chte, kann dies mit wenig Zeitaufwand tun.</p>
<div data-id="477382" class="ajaxGalleryInit" style="display:none;"></div>
<p>Im zweiten Schritt gibt man bereits den Titel der Webseite an und kann dann eine E-Mail-Adresse und ein Passwort hinterlegen. Damit hat man den Registrierungsprozess abgeschlossen und ist bereits voll im Gange.</p>
<h3>Das Design von der Stange?</h3>
<p>Bereits im n&auml;chsten Schritt kann man sich f&uuml;r eine Designvorlage entscheiden. Die l&auml;sst sich &uuml;brigens im Nachhinein jederzeit anpassen. In jedem Fall stehen dutzende unterschiedlicher Themen zur Wahl, die man au&szlig;erdem in puncto Farbe und Layout noch den eigenen W&uuml;nschen anpassen kann. Dar&uuml;ber hinaus arbeitet der Anbieter daran, immer neue Designs bereitzustellen.</p>
<p>An dieser Stelle wird man dann gebeten, sich zu entscheiden, ob man gratis mitmachen m&ouml;chte, oder sich f&uuml;r einen der vorhandenen Account-Typen entscheiden mag. Momentan ist auch das kostenlos m&ouml;glich, denn sowohl der Pro-Account mit 1 Domain oder der Business-Account mit 2 Domains werden in den ersten drei Monaten mit 0 Euro berechnet. Ihr k&ouml;nntet also nach belieben alle Funktionen auf Herz und Nieren &uuml;berpr&uuml;fen.</p>
<div data-id="477381" class="ajaxGalleryInit" style="display:none;"></div>
<h3>Drei Pakete bei Webador</h3>
<p>An dieser Stelle kann ich kurz erl&auml;utern, welche Pakete es gibt:</p>
<ul>
<li>Free: f&uuml;r Webseite oder Blog mit Webador-Adresse.</li>
<li>Pro: eine Domain, Webshop mit zehn Produkten und ein E-Mail-Postfach.</li>
<li>Business: zwei Domains, Webshop (unbegrenzt) und ein XL-E-Mail-Postfach.</li>
</ul>
<h3>Der Homepage-Baukasten im Einsatz</h3>
<p>Hat man diese Entscheidung f&uuml;r ein Paket getroffen, wird man direkt zum Homepage-Baukasten weitergeleitet. Dieser ist &auml;hnlich aufgebaut wie eine Desktop-App. In der linken Seitenleiste gibt es diverse Elemente f&uuml;r Titel, Text, Bild, Formulare, Buttons, Galerien, und viele weitere. Zu Beginn wird man auch in die Bedienung der Oberfl&auml;che eingef&uuml;hrt.</p>
<div data-id="477383" class="ajaxGalleryInit" style="display:none;"></div>
<p>Man kann &uuml;ber eine Navigation am oberen Bildrand au&szlig;erdem zur Verwaltung der Seiten wechseln, oder zum Design. Auch kann man dort den &bdquo;Webshop&ldquo; verwalten. Wer wom&ouml;glich in der Corona-Zeit angefangen hat, sich selbst neu zu erfinden und auf einmal Kissen anfertigt oder Holzschnitzereien, f&uuml;r den ist &uuml;ber ein Produkt wie Webador ein einfacher Weg in die Selbst&auml;ndigkeit gegeben. Nat&uuml;rlich darf man dann nicht vergessen, beim Amtsgericht des Vertrauens noch ein Gewerbe anzumelden, damit auch der Fiskus zufriedengestellt wird.</p>
<p>F&uuml;gt man eine neue Seite hinzu oder verwaltet man vorhandene, kann man an dieser Stelle auch Metadaten f&uuml;r die Suchmaschine eintragen, entscheiden, ob die Seite &uuml;berhaupt indexiert werden soll und sogar, ob die Inhalte wom&ouml;glich mittels Passwort gesch&uuml;tzt werden sollen.</p>
<div data-id="477378" class="ajaxGalleryInit" style="display:none;"></div>
<p>Mittels Drag-and-Drop kann man die Hierarchie der Seiten festlegen und passt so auch automatisch die Navigation auf der Webseite an. Im Prinzip ist alles selbsterkl&auml;rend und zur Not kann man sich neugierig durchklicken.</p>
<p>Man bearbeitet die eigene Seite quasi &bdquo;offline&ldquo; und es gibt oben rechts in der Oberfl&auml;che den Button zum &bdquo;Ver&ouml;ffentlichen&ldquo;.</p>
<h3>Design f&uuml;r Desktop und Smartphone</h3>
<p>Einsteiger im Bereich Webseiten h&ouml;ren vielleicht gerne, dass die Designs von Webador allesamt auch auf dem Smartphone funktionieren. Man kann bei der Designauswahl und -bearbeitung zwischen der Vorschau auf dem Desktop und dem Smartphone hin und her wechseln.</p>
<div data-id="477379" class="ajaxGalleryInit" style="display:none;"></div>
<h2>Online-Shop mit Webador</h2>
<p>Wie weiter oben schon angedeutet, gibt es f&uuml;r viele Leute mit dem Webador-Baukasten auch die M&ouml;glichkeit, einen eigenen Onlineshop einzurichten. Das ist insofern ganz hilfreich, wenn man zwar ein Talent hat, das aber nicht zwangsl&auml;ufig im Design von Webseiten liegt, sondern meinetwegen im Einkochen von Marmelade oder im &bdquo;Upcycling&ldquo; von M&ouml;beln.</p>
<div data-id="477380" class="ajaxGalleryInit" style="display:none;"></div>
<p>Die Shop-Schnittstelle von Webador bietet eine Produktverwaltung und erlaubt die Abwicklung von Bestellungen, auf einfache Art und Weise. Vor allem f&uuml;r den Einstieg in eine potenzielle Selbst&auml;ndigkeit ist das ein Plus. Ben&ouml;tigt man hinterher weitere M&ouml;glichkeiten, kann man sich immer noch damit auseinandersetzen. Denn nicht jeder will in die H&ouml;hle der L&ouml;wen oder ist ein Mark Zuckerberg mit einem Businessplan in der Tasche, f&uuml;r den man Risikokapital erh&auml;lt.</p>
[mn-youtube id="D7M2RDEH_iE"]
<h2>Verbesserungspotenzial bei der Lokalisierung</h2>
<p>Man merkt Webador noch an, dass der Anbieter aus den Niederlanden stammt. Denn in der Lokalisierung wirkt das Angebot an manchen Stellen noch etwas unrund. Beispielsweise w&uuml;rde hierzulande wohl niemand &bdquo;Folgender Schritt&ldquo; zur Aufforderung sagen, doch &bdquo;weiter&ldquo; zu klicken, und das obwohl es nicht falsch ist.</p>
<h2>Fazit</h2>
<p>Etwas m&ouml;glichst einfach zu gestalten, oder aber m&ouml;glichst viele M&ouml;glichkeiten anzubieten, ist eine Herausforderung, vor der viele Dienstleister im Netz stehen. Deswegen ist schon der erste Kontakt wichtig. Webador h&auml;lt den Anmeldeprozess kurz, erlaubt schon zu diesem Zeitpunkt die Auseinandersetzung mit der eigenen Webseite. Dadurch, dass man das Design auch hinterher &auml;ndern kann, ist selbst wankelm&uuml;tigen Personen geholfen, die &ouml;fter mal was Neues suchen.</p>
<p>Doch Webador hat nat&uuml;rlich auch Grenzen. Die gibt es, wenn man beispielsweise eine Community aufbauen wollte, oder umfangreiche Websites mit &bdquo;Big Data&ldquo; und dutzenden von Funktionen anbieten wollte. Ein zweites Wikipedia kann man mit Webador nicht bauen. Trotzdem kann man ein Produkt wie dieses empfehlen, aber eben nicht jedem. Technisch affine Personen gehen eh ihren eigenen Weg, aber wenn man seine Inhalte oder Produkte schnell ins Netz bringen m&ouml;chte, dann kann man das mit Webador tun. Und die kostenlose Variante ist zudem geeignet, um schnell einmal Ideen durchzuspielen.</p>
<p>Der Beitrag <a href="https://macnotes.de/2020/12/02/webador-im-test-websites-erstellen-mit-dem-baukasten-geht-das/">Webador im Test: Websites erstellen mit dem Baukasten, geht das?</a> erschien zuerst auf <a href="https://macnotes.de">Macnotes.de</a>.</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://www.youtube.com/embed/D7M2RDEH_iE" duration="868">
			<media:player url="https://www.youtube.com/embed/D7M2RDEH_iE" />
			<media:title type="html">Webador im Test: Websites erstellen mit dem Baukasten, geht das? &#124; Macnotes.de</media:title>
			<media:description type="html">Mit Webador gibt es einen Homepage-Baukasten, der auch Bestandteile für eigene Onlineshops bereithält. Für manche Leute stellt eine solche Plattform den ersten Weg ins Netz dar. Wir haben uns einmal angesehen, was man damit alles anstellen kann. Immer mal wieder gibt es Gelegenheiten, sich selbst un</media:description>
			<media:thumbnail url="https://macnotes.de/images/2020/12/d7m2rdeh_ie.jpg" />
			<media:keywords>Internet</media:keywords>
		</media:content>
	</item>
	</channel>
</rss>
