Ich habe ein IFTTT-Rezept , das gelegentlich Posts für mich erstellt, aber aus irgendeinem seltsamen Grund werden drei, manchmal vier Posts mit demselben Inhalt erstellt.
Ich möchte einen add_action
Hook / Callback hinzufügen, um zu überprüfen, was ein neuer Beitrag sein wird, und, falls er bereits vorhanden ist, den Beitrag abzubrechen oder in den Papierkorb oder ähnliches zu verschieben.
Ich habe das gefunden, xmlrpc_prepare_post
aber ich glaube nicht, dass ich es von dort aus stornieren kann. Es sei denn, ich kann ein Attribut aktualisieren und auf Papierkorb setzen?
Aktualisieren.
Ich habe Folgendes versucht und es gelangt immer nur in den xmlrpc_call, aber niemals in xmlrpc_wp_insert_post_meta. Ich habe sogar einen fest codierten Aufruf von add_filter hinzugefügt (nicht nur für den Fall, dass newPost), und meine Protokolle zeigen niemals eine solche Protokollierungsnachricht an.
Hier ist der Code:
function hueman_xmlrpc_call( $method )
{
error_log("XMLRPC | hueman_xmlrpc_call Method = $method \n" , 3, '/home/.../debug.log');
if( 'wp.newPost' === $method || 'metaWeblog.newPost' === $method )
{
error_log("XMLRPC | hueman_xmlrpc_call method = " . $method . " \n" , 3, '/home/.../debug.log');
add_filter( 'xmlrpc_wp_insert_post_data', 'hueman_xmlrpc_wp_insert_post_data' );
}
}
add_action('xmlrpc_call', 'hueman_xmlrpc_call', 1 );
add_filter( 'xmlrpc_wp_insert_post_data', 'hueman_xmlrpc_wp_insert_post_data' );
function hueman_xmlrpc_wp_insert_post_data( $post_data )
{
error_log("XMLRPC | hueman_xmlrpc_wp_insert_post_data \n" , 3, '/home/.../debug.log');
// Check if the post title exists:
$tmp = get_page_by_title(
$post_data['post_title'],
OBJECT,
$post_data['post_type']
);
if( is_object ( $tmp ) )
{
// Go from 'insert' to 'update' mode within wp_insert_post():
//$post_data['ID'] = $tmp->ID;
$post_data['post_status'] = 'trash';
error_log("XMLRPC | hueman_xmlrpc_wp_insert_post_data I TRASHED IT! \n" , 3, '/home/.../debug.log');
}
return $post_data;
}
In den Protokollen habe ich diese Art von Protokollanweisungen:
XMLRPC | hueman_xmlrpc_call Method = mt.supportedMethods
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getRecentPosts
XMLRPC | hueman_xmlrpc_call Method = mt.supportedMethods
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getRecentPosts
XMLRPC | hueman_xmlrpc_call Method = mt.supportedMethods
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getRecentPosts
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getCategories
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.newPost
XMLRPC | hueman_xmlrpc_call method = metaWeblog.newPost
Dann werden andere Filter angezeigt, die ich beim Erstellen eines Artikels hinzugefügt habe. Ich weiß, dass ich wahrscheinlich die Artikel dort reparieren werde, aber ich bin sicher, dass diese XMLRPC-Filter / -Aktionen funktionieren sollten.
Aus den Protokollen geht hervor, dass es in die Datei if newPost geht und den Filter 'xmlrpc_wp_insert_post_data' hinzufügt, aber die Funktion hueman_xmlrpc_wp_insert_post_data niemals ausführt ... :(
Antworten:
Es sieht so aus, als würde der
xmlrpc_prepare_post
Filter nur auf die Ausgabe derwp_getPost
undwp_getRevision
-Methoden derwp_xmlrpc_server
Klasse angewendet .Es wäre toll, wenn diese Codezeile:
würde durch zusätzliche Eingabeargumente ersetzt werden, zum Beispiel:
aber das wird nach diesem Ticket nicht passieren .
Wir müssen also einen anderen Weg finden, um dies zu umgehen.
Mögliche Problemumgehungen:
Hier sind einige ungetestete Ideen, die
xmlrpc_call
diexmlrpc_wp_insert_post_data
Filter und verwenden.Ändern Sie die Eingabedaten, bevor sie eingefügt werden mit
wp_insert_posts()
:Hier versuchen wir, bei
wp.newPost
Anrufen einen vorhandenen Beitrag mit demselben Titel zu finden . Wenn wir eines finden, fügen wir esID
dem$post_data
Array hinzu, sodass es stattdessen aktualisiert wird.Beachten Sie, dass wir
post_status
stattdessen auch Folgendes ändern könnten :Alle zusätzlichen Einsätze werden also in den Papierkorb geleitet .
Sie können auch versuchen, über den Filter eine eigene Einfügemethode zu erstellen
xmlrpc_methods
.Ich hoffe, Sie können dies an Ihre Bedürfnisse anpassen, vorausgesetzt, dies wird funktionieren ;-)
Update : Ich habe diese Idee jetzt getestet und sie funktioniert. Ich kann sowohl die duplizierten Beiträge in den Papierkorb werfen als auch direkt aktualisieren.
Vielen Dank an @DavidPeterson, dass er meine albernen PHP-Syntaxfehler bemerkt hat, als ich den Code im WPSE-Editor bearbeitet habe ;-)
quelle
In der Datei wp-includes / class-wp-xmlrpc-server.php
Innerhalb der Funktion mw_newPost () nach diesen Zeilen:
Hinzufügen:
Und erstellen Sie eine Erklärung:
quelle