Die Anzahl der Zeichen eines Beitrags können wir nach eigenem Verfahren berechnen. Dies kann sinnvoll sein, wenn z. B. Texte/Inhalte über „Benutzerdefinierte Felder“ (unter Beitrag bearbeiten) mit ausgewertet werden sollen, da sie vom Theme mit in den Inhalt eines Beitrags eingebunden werden. Um dies zu realisieren, muss wie im Folgenden zu sehen ist, eine Funktion für den Hook (action) wpvgw_calculate_character_count
hinzugefügt werden (z. B. in function.php
des Themes):
/** * Calculate the number of characters of a post (hook). * * @param string $post_title The title of a post. * @param string $post_content Textual content of a post. * @param string $post_excerpt The textual excerpt of a post (if enabled in options). * @param WPVGW_MarkersManager $markers_manager The markers manager. Can be used to clean up WordPress text by calling clean_word_press_text() for better character count calculation. * @param WP_Post $post The affected post. Can be null if the post does not exists (yet). * @param object $ajax_custom_object A custom object from an ajax call. It can be used for further post data that is necessary for calculation. * @param int $return_custom_count Has to be filled with the custom character count (it’s the return value). */ function calculate_character_count( $post_title, $post_content, $post_excerpt, $markers_manager, $post, $ajax_custom_object, &$return_custom_count ) { // clean up post content $cleanedPostContent = $markers_manager->clean_word_press_text($post_content); // return character count $return_custom_count = mb_strlen($cleanedPostContent); } add_action( 'wpvgw_calculate_character_count','calculate_character_count', 10, 7 );
In der Funktion calculate_character_count
erfolgt dann die eigentliche Berechnung der Zeichenanzahl. Diese Funktion muss die Zeichenanzahl über den Parameter $return_custom_count
(„by reference“) als Integer (int) zurückgeben.
Soll die Zeichenanzahl bereits beim Bearbeiten eines Beitrags korrekt angezeigt werden („Zählmarken für VG WORT“ bei Beitrag bearbeiten), müssen die zusätzlichen Daten (z. B. benutzerdefinierte Felder) via Javascript und Ajax an das Plugin übertragen werden. Dazu fügen wir den folgenden Javascript-Code ein, der auf der Beitrag-Bearbeiten-Seite verfügbar sein muss:
/** * Get additional data related to the current post. This data will be submitted by the character count calculation ajax call. * * @returns object An custom object. */ function wpvgw_post_get_custom_object () { return {'custom_field1' : 'Jahr um Jahr musste ich', 'custom_field2' : 'zum Geigenunterricht.'}; }
Die Daten, die die Funktion pvgw_post_get_custom_object
zurückgibt, werden an die obige Funktion calculate_character_count
über den Parameter $ajax_custom_object
weitergeleitet und können dort bei der Berechnung mit einbezogen werden.
das scheint mit advanced custom fields nicht zu funktionieren 🙁
Möchten Sie mir via E-Mail (siehe Hilfe-Seite in Prosodia VGW OS) mitteilen, woran es genau hapert?
Warum die postID nicht standardmäßig mitgeschickt wird, sondern nur der postTitle, ist mir nicht so recht verständlich.
Das Beispiel für wpvgw_post_get_custom_object() ist ebenfalls nicht gerade anwendungsnah, oder?
So etwas wäre da hilfreicher:
function wpvgw_post_get_custom_object(){
let retObj = {};
let thePostId = jQuery('#post_ID');
if (thePostId.length) {
retObj = {'postID' : thePostId.val() };
}
return retObj;
}
Es wird doch das Post-Objekt als Argument übergeben. Dort ist dann auch die Post-ID enthalten.
Mittels
wpvgw_post_get_custom_object()
braucht keine Post-ID übertragen zu werden. Dort sollen nur die Texte der zusätzlichen Text-Felder hinein, deren Zeichenanzahl mitberechnet werden sollen.Schöne Grüße!
Hallo,
Ich wollte mal nachfragen, ob die Funktion noch weiterentwickelt wird?
Ich verwende ACF pro (also Advanced Custom Fields [https://www.advancedcustomfields.com/]) und habe ein paar Felder, in dem noch weiterer Content hinterlegt wird.
Ehrlich gesagt, blicke ich bei diesem Code-Beispiel nicht so durch, also wie das nun konkret funktioniert. Einbauen und funktioniert, wird wahrscheinlich so nicht klappen, oder?
Ich weiß nicht ob das ein Problem ist, aber ich habe 1 festes Feld, aber auch dynamische Felder (ähnliche wie Kapitel/Schritte), also welche die nicht fest definiert sind, sondern die ich mit ACF auf der Bearbeitungsseite erst manuell erstellen kann. Ich weiß, dass zum auslesen (mit while…) in jedem Fall die PostID benötigt wird. Ich schreib das einfach mal, weil ja ein anderer Kommentator schrieb, dass das derzeit noch nicht gegeben ist?
Vielleicht wäre es einfacher, wenn man im Theme, die ausgebenden Felder einfach mit dem Count-Befehl zählen würde und wenn man diese Zahl dann verwenden könnte?
Oder ist das allgemein nicht so schwer zu realisieren. Dann würde ich es gerne mal versuchen.
Lieben Gruss,
Dj
Liebe Entwickler,
seit dem letzten Update des Plugins kann ich die Zählmarken erst setzen, wenn der Artikel schon online ist. Ich weiss nicht so recht, was ihr euch dabei überlegt habt, das zu ändern. Aber ich möchte euch gerne bitten, diese Änderung wieder rückgängig zu machen.
Wieso? Ich arbeite als Reiseblogger und schreibe meine Artikel vor. Das ermöglicht mir, die Texte zu einem fixen Zeitpunkt zu veröffentlichen – auch dann, wenn ich in einer anderen Zeitzone bin oder gerade kein Internet habe.
Wenn ich zuhause bin und die Texte händisch online stelle, ist das kein Problem. Aber von unterwegs geht das einfach nicht so gut. Und da ich die meisten Leser gleich nach Veröffentlichung habe, verliere ich dank der Neuerung unter Umständen Geld.
Ich finde Euer Plugin eigentlich toll. Aber in der jetzigen Version muss ich vor der nächsten längeren Reise überlegen, ob ich das downgrade (was ja auf Dauer auch nicht ideal ist) oder das wieder vor Hand einfüge.
Aber vorerst warte ich mal, vielleicht bin ich ja nicht der Einzige, der Euch auf diese Verschlimmbesserung aufmerksam macht und ihr macht die Änderung mit der nächsten Version wieder rückgängig.
Ich bedanke mich schon mal.
Oli
Die Standard-Einstellung ist nun, dass Zählmarken nur zugeordnet werden, wenn Beiträge geplant oder veröffentlicht werden. In Ihrem Fall könnte man die Beiträge auf „planen“ einstellen, nicht? Ansonsten können Sie das alte Verhalten wiederherstellen, indem Sie „Beiträgen nur eine Zählmarke zuordnen, wenn veröffentlicht/geplant“ in den Einstellungen deaktivieren.
Schöne Grüße!
Hi. Ich bins nochmal. Nachdem ich hier ja einen Kommentar geschrieben hatte, hattest Du mir ja nochmal per Mail geschrieben, dass es ein Update gegeben hat und das es nun möglich ist, in ACF direkt auszuwählen, welche Felder gewertet werden sollen.
Ich hab die Mail aber nicht wieder gefunden, aber mir war es wichtig, dass ich zumindest nochmal Feedback gebe.
Ich finde die Funktion wirklich richtig klasse. Hab erst gar nicht gewusst, wo ich suchen soll. Aber nachdem ich dann geguckt hatte, fand ich die Funktion einfach nur super.
Ein Klick und fertig.
Also, vielen Dank, dass Du das so gut gelöst hast. Finde ich super.
Lieben Gruss,
Dj
Hallo, wäre schön zu erfahren WO diese Funktion zu finden ist 😉
Hallo,
offenbar wurde bei einem der letzten Updates ein Funktionsname geändert von
cleanWordPressText
aufclean_word_press_text
und damit nicht nur die Abwärtskompatibilität gebrochen (Call to undefined method WPVGW_MarkersManager::cleanWordPressText()
), sondern auch die hier gebotene Dokumentation ist damit nicht mehr korrekt.Ein Alias wäre nett gewesen…
Pardon, da haben Sie recht. Danke für den Hinweis. Das habe ich beim Refactoring nicht berücksichtigt. Ich werde einen Alias hinzufügen und die Dokumentation aktualisieren.
Versionsübersicht:
– Plugin Version: 3.25.3
– WordPress Version: 6.1.1
Hallo in die Runde!
Ich habe soeben die Zeichenzahl erfolgreich berechnen können. An 2 Stellen kommt das zum tragen:
1. Auf der Übersichtsseite (`/wp-admin/edit.php?post_type=page`) in der Spalte „Zeichen”
2. Auf der Detailseite (`/wp-admin/post.php?post=5454&action=edit`) ganz unten im Abschnitt „Zählmarken für VG Wort”
Dafür habe ich in der _functions.php_ den nachfolgenden Code hinzugefügt. Dieser ist adaptiert von dem auf dieser Seite (https://prosodia.de/prosodia-vgw-os/anzahl-der-zeichen-selbst-berechnen/) ganz oben gezeigten Beispiel – und erweitert durch die **fehlenden Funktionen**, die die anderen Nutzer:innen in den vorangegangenen Kommentaren bemängelt haben.
Vor allem https://prosodia.de/prosodia-vgw-os/anzahl-der-zeichen-selbst-berechnen/#comment-346 meinte denke ich, dass beim Aufruf der Funktion wpvgw_calculate_character_count via Ajax nur `$post_title` übergeben wird, nicht z.B. `$post_id`.
Die Antwort darauf (https://prosodia.de/prosodia-vgw-os/anzahl-der-zeichen-selbst-berechnen/#comment-363) war: „Mittels wpvgw_post_get_custom_object() braucht keine Post-ID übertragen zu werden. […] Es wird doch das Post-Objekt als Argument übergeben”.
Das stimmt aber nicht immer, denn in wp-vgwort/views/post-view.php steht bei Zeile 82 in der Funktion ajax_get_character_count in der Zeile 93:
„`php
$characterCount = $this->markersManager->calculate_character_count($postTitle, $postContent, $postExcerpt, null, $postCustomObject, $additionalTexts);
„`
Und da steht ja tatsächlich `null` als Wert für `$post`. Ich denke das ist tatsächlich ein Fehler, der sich durch die Hersteller beheben ließe!?
Also hier meine erweiterte Funktion, die auch in dem Fall, dass `$post` dem Wert `null` entspricht versucht, den zugehörigen `WP_Post` zu finden. Diese Funktion wird vom Plugin wie bereits erwähnt sowohl auf der Übersichts- als auch auf der Detailseite über AJAX aufgerufen.
„`php
/**
* Calculate the number of characters of a post (hook).
*
* @param string $post_title The title of a post.
* @param string $post_content Textual content of a post.
* @param string $post_excerpt The textual excerpt of a post (if enabled in options).
* @param WPVGW_MarkersManager $markers_manager The markers manager. Can be used to clean up WordPress text by calling clean_word_press_text() for better character count calculation.
* @param WP_Post $post The affected post. Can be null if the post does not exists (yet).
* @param object $ajax_custom_object A custom object from an ajax call. It can be used for further post data that is necessary for calculation.
* @param int $return_custom_count Has to be filled with the custom character count (it’s the return value).
*/
add_action(‚wpvgw_calculate_character_count‘, function ($post_title, $post_content, $post_excerpt, $markers_manager, $post, $ajax_custom_object, &$return_custom_count) {
global $wpdb;
// Grab the post (possibly `null`)
$wp_post = get_post();
if ($wp_post == null && isset($post) && !empty($post)) {
// The function `wpvgw_calculate_character_count` can be called via AJAX on a detail page (/wp-admin/post.php?post=123&action=edit). In this case get_post(); would not return a `WP_Post` but `null`. We can try to use `$post` instead.
$wp_post = get_post($post->ID);
}
if ($wp_post == null && isset($post_title) && !empty($post_title)) {
// In case `$post` is empty (which does happen when we call `$this->markersManager->calculate_character_count` in `ajax_get_character_count` with the value `null` in wp-vgwort/views/post-view.php), we try to get the WP_Post id from `$post_title`.
$post_id = $wpdb->get_var(„SELECT ID FROM $wpdb->posts WHERE post_title = ‚“ . $post_title . „‚“);
if ($post_id) {
$wp_post = get_post($post_id);
}
}
if(!empty($wp_post)) {
// Overwrite $post_content with our custom data. In this case we execute a Flynt shortcode that looks like `[flyntTheContent id=“8618″]` that holds all the HTML for our page body.
$post_content = do_shortcode($wp_post->post_content);
}
// clean up post content
$cleanedPostContent = $markers_manager->clean_word_press_text($post_content);
// return character count
$return_custom_count = mb_strlen($cleanedPostContent);
}, 10, 7);
„`
Ich hoffe ich konnte hiermit irgendeiner verlorenen Seele da draußen den Tag retten ✌️