WordPress-Posts für Literar-Mechana-Meldung als Tabelle ausgeben
Wer Blogger:in (und damit Urheber:in) sowie Mitglied bei der Literar-Mechana ist, kann dort seine Blogposts für die Reprographievergütung, die sich aus der Urheberrechtsabgabe speist, melden. Für WordPress habe ich folgendes PHP-Skript geschrieben, das einfach in ein Seiten-Template eingebunden werden kann und welches dort berechtigte Posts einfach als Tabelle ausgibt.
Warum ein Skript?
Die Einreichung erfolgt aktuell via Excel-Tabelle. Ein schneller Weg, diese zu befüllen, ist die Ausgabe einer HTML-Tabelle, die man einfach via Copy-&-Paste einfügen kann.
Anforderungen beachten!
Um die Ausschüttung zu erhalten, müssen einige Anforderungen erfüllt sein (siehe entsprechendes PDF), insbesondere 60.000 Anschläge im Jahr, wobei jeder Artikel mindestens 2.500 Anschläge aufweisen muss (für lyrische Texte gelten 1.500, ich wende in meinem Skript aber die 2.500er-Regel an).
Das PHP-Skript
Folgendes einfaches Skript kann man z.B. in WordPress in einer eigens angelegten Seite im PHP-Template unterbringen – ggf. bei Sichtbarkeit auf »Privat« stellen (falls jemand ein Plugin daraus machen möchte, jederzeit gerne!). Zunächst das Skript, danach die Erklärung im Detail (Disclaimer: Erstellt nach bestem Wissen und Gewissen, keine Garantie für Richtig- bzw. Vollständigkeit):
<?php
function replace_for_count($text) {
$text = str_replace('--', '–', $text);
return $text;
}
for ($year = 2020; $year <= date("Y"); $year++) {
$args = array (
'post_type' => 'post',
'nopaging' => true,
'posts_per_page' => '10000',
'order' => 'DESC',
'orderby' => 'post_date',
'year' => '' . $year . '',
'status' => 'publish'
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
$postLength=iconv_strlen(
html_entity_decode(
strip_shortcodes(
wp_strip_all_tags(
replace_for_count(
$post->post_title.$post->post_content
), true)
)
)
);
if ($postLength >= 2500 ) {
$postTable.="<tr style=\"border-bottom:0;\"><td>" .
replace_for_count($post->post_title) .
"</td><td><a href=\"" .
get_permalink($post->ID) . "\">" .
get_permalink($post->ID) .
"</a></td><td>" .
date( "d.m.Y" , strtotime($post->post_date) ) .
"</td><td>" .
$postLength . "</td></tr>";
} // if
} // while
} // if
} // for
echo "<table>" . $postTable . "</table>";
?>
Das macht das Skript
Zunächst habe ich eine kleine Funktion deklariert, die ggf. Zeichen ersetzt. In meinem Fall z.B. das doppelte Minus, aus dem bei mir bei der Ausgabe ein typografisch korrekter Gedankenstrich (Halbgeviertstrich) gemacht wird und nur als ein Anschlag zählen soll. Man kann dort bei Bedarf weitere Zeichen ersetzen.
Dann folgt die for-Schleife, die ab dem Jahr 2020 (Posts sind nur drei Jahre rückwirkend meldefähig) alle Posts durchgeht.
Dafür baue ich ein eigens WordPress-Query, das sich alle Posts für das entsprechende Jahr holt. Ist das erledigt wird in der folgenden while-Schleife jeder Post auf die Mindestlänge von 2.500 Zeichen geprüft. Ist die Länge erfüllt wird ein String (hier $postTable) um eine HTML-Tabellenzeile erweitert, die dem aktuellen Format der Excel-Beitragsliste entspricht. Am Ende wird die Tabelle ausgegeben.
Die Zeichenberechnung im Detail
Wichtig ist in meinen Augen die korrekte Berechnung der Postlänge, denn hier hatte ich in der Vergangenheit mit WordPress so meine Probleme. So lieferte bei mir ein simples strlen(get_the_title() . get_the_content()); komplett andere Werte, die oftmals (komischerweise nicht immer) weit unter der tatsächlichen Zeichenanzahl lagen (falls wer weiß warum, freue ich mich über einen Tipp in den Kommentaren).
Daher gehe ich kurz die genaue Reihenfolge der Funktionsaufrufe durch. Ich habe bei mir stichprobenartig mit einer Zählung des Strings in Apple Pages vergleichen und diese stimmten immer exakt überein – über Verbesserungsvorschläge freue ich mich natürlich trotzdem:
Von innen nach außen:
- replace_for_count führt zuerst die Zeichenersetzung durch, bei mir wie gesagt nur »−−« durch »–«.
- wp_strip_all_tags entfernt alle HTML-Tags, z.B. den kompletten Anchor inklusive href-Attribut bei Links etc. Hat sich hier ein HTML-Fehler in eurem Post eingeschummelt, wird der Post an der Stelle aübrigens bgeschnitten – nur, falls sich jemand wundert, warum Posts fehlen oder als viel zu kurz aufscheinen.
- wp_strip_short_codes entfernt WordPress-Shortcodes, die in eckigen Klammern im Post eingefügt wurden (gibt es bei mir de facto nicht, aber sicher ist sicher).
- html_entity_decode wandelt alle HTML-Entities in ihr »echtes« Zeichen um, also wird z.B. aus einem »–« ein »–«, aus einem »ö« ein »ö« etc.
- iconv_strlen zählt zu guter Letzt die tatsächlichen Zeichen im String (und nicht die Bytes, wie das standardmäßige strlen – sollte keinen Unterschied machen, aber auch hier: sicher ist sicher).
Ich gehe bei der Berechnung relativ konservativ vor, da ich Absätze und auch das Datum nicht als Anschläge zähle – falls hier wer mehr weiß oder schon diesbezügliche Melde-Erfahrung hat, hinterlasst gern einen Kommentar.
Eure Meinung
Apropos Kommentar hinterlassen: Ihr habt Fragen, Anmerkungen oder Verbesserungen? Darüber freue ich mich wie immer in den Kommentaren!
Neueste Artikel
Schlagwörter
Bloggen · Literar Mechana · PHP · WordPress
Teilen & Favorisieren
Twitter (0 & 2) · Mastodon (0 & 0) · Facebook (0 & 0)
Kommentieren
Am liebsten hier, gerne aber auch auf Twitter, Mastodon und Facebook.
Ich freue mich über jeden Kommentar und antworte gern innerhalb von 24 Stunden.