it-swarm.com.de

Benutzerdefinierte Felder XMLRPC und Unterstrichen

Ich habe meine Anwendung erstellt, um alle meine Blogs von meinem Desktop aus zu automatisieren. Ziel, ich werde Blog posten. Das ist alles. Ich habeXMLRPCservice verwendet, wie Sie wissen "xmlrpc.php".

Ich habe viele Teile gebaut, fast fertig ... Aber ich habe mich an benutzerdefinierten Feldern festgehalten, die mit (_) einem Unterstrich beginnen. Ich möchte als "_thumbnail_id" => (int) Nummer speichern. Nichts ist passiert.

Aber als ich "thumbnail_id" oder ähnliches ausprobiert habe, ohne mit einem Unterstrich zu beginnen. Es ist in Ordnung. Gut funktionieren, aber mit einem Unterstrich beginnen ...

Ich brauche es, um das Bild des Beitrags zu bestimmen. Ohne diesen Tag; Ich konnte nicht Und ich kenne keine Alternativen.

Ich finde das: https://wordpress.org/support/topic/how-can-i-change-protected-params-xmlrpc Aber nicht mein Problem zu lösen. Ich möchte keine WordPress-Dateien ändern. Wenn ich muss, kann ich ein kleines Skript ohne RPC schreiben.

Jede Hilfe wird fantastisch sein!

3

Spielen mit XML-RPC und unterstrichenen benutzerdefinierten Feldern:

Angenommen, wir möchten das vorgestellte Bild mit $remote_post_id auf einen bestimmten Beitrag setzen.

Wir möchten, dass es sich um den Anhang mit der ID 300 handelt, also soll _thumbnail_id300 sein.

Hier sind drei Methoden, wie man das erreichen könnte:

Methode 1 - Verwenden von post_thumbnail

Es ist möglich, das vorgestellte Bild mit dem Parameter post_thumbnail zu aktualisieren/hinzuzufügen:

$result = $client->query( 
    'wp.editPost', 
    array(
        $blog_id,
        $username,
        $password,
        $remote_post_id,
        $post_data = array(
            'post_thumbnail' => '300',
        ),
    ) 
);

wie zu sehen ist [hier in der wp_xmlrpc_server] [1] Klasse.

Methode 2 - Verwenden von custom_fields mit meta_id

Wenn wir ein benutzerdefiniertes Feld eines Posts aktualisieren möchten, müssen wir dessen Datenbank-meta_id-Wert kennen.

Aber woher kennen wir den meta_id?

Die benutzerdefinierten Felder sind standardmäßig enthalten, wenn wir einen Beitrag abrufen mit:

$result = $client->query( 
    'wp.getPost', 
    array(
        $blog_id,
        $username,
        $password,
        $remote_post_id,
    ) 
);

Wenn der Beitrag eine Miniaturansicht des Beitrags enthält, enthält das obige Ergebnis diesen Teil:

<member>
    <name>custom_fields</name>
    <value>
        <array>
            <data>
                <value>
                    <struct>
                        <member>
                            <name>id</name>
                            <value>
                                <string>560</string>
                            </value>
                        </member>
                        <member>
                            <name>key</name>
                            <value>
                                <string>_thumbnail_id</string>
                            </value>
                        </member>
                        <member>
                            <name>value</name>
                            <value>
                                <string>200</string>
                            </value>
                        </member>
                    </struct>
                </value>
            </data>
        </array>
    </value>
 </member>

wobei der meta_id beispielsweise 560 ist und der alte meta_value200 ist.

Jetzt können wir den Meta-Wert von _thumbnail_id mit unserem neuen Wert aktualisieren:

$result = $client->query( 
    'wp.editPost', 
    array(
        $blog_id,
        $username,
        $password,
        $remote_post_id,
        $post_data = array(
            'custom_fields' => array( 
                array( 
                    'id'    => '560', 
                    'key'   => '_thumbnail_id', 
                    'value' => 300 
                )
            ),
        ),
    ) 
);

Beachten Sie, dass wir, wenn wir den Teil meta_id überspringen, nur add_post_meta() anstelle der in this trac eingeführten [update_metadata_by_mid()] [2] ausführen. Wir müssen auch die Fähigkeit edit_post_meta haben.

Dies ist jedoch nicht die ganze Geschichte, da Metaschlüssel, die mit einem Unterstrich (_) beginnen, protected sind.

Wir können das beheben, indem wir die Funktion [register_meta()] [3] auf der Remote-Site verwenden.

Zum Beispiel:

/**
 * Unprotect the _thumbnail_id meta key to allow updates via XML-RPC 
 * We need to set this up on the remote site.
 */

add_action( 'init', function() {
        register_meta( 'post', '_thumbnail_id', 'absint', '__return_true' );
});

um den Schutz des _thumbnail_id Metaschlüssels aufzuheben. Ich habe zuerst die intval als Desinfektions-Rückruf ausprobiert, aber das hat nicht funktioniert.

Wir könnten ein ähnliches Setup für andere geschützte Metaschlüssel verwenden.

Methode 3 Verwenden einer benutzerdefinierten XML-RPC-Methode.

Wie @MarkKaplun in seiner Antwort erwähnte, konnten wir das XML-RPC-Setup an unsere Bedürfnisse anpassen. Wir könnten zum Beispiel den xmlrpc_methods-Filter verwenden, um unsere eigene Methode hinzuzufügen.

Der Codex enthält weitere Informationen zu diesem Thema.

Verweise:

Hier sind einige Links, die mir beim Testen geholfen haben:

3
birgire

_Unterstrichene Metadaten sind Daten, die sich in der Software befinden und von einem Benutzer nicht direkt geändert werden. Dies ist wahrscheinlich der Grund, warum Sie es nicht über XMLRPC ändern können.

Wenn Sie diese Art von Funktionalität benötigen, können Sie ein kleines Plugin schreiben, das den Datensatz erweitert, den Sie mit XMLRPC ändern können.

Da es sich bei Ihrer Frage jedoch speziell um vorgestellte Bilder handelt, sollten Sie nach einer API suchen, mit der Sie einen Anhang als vorgestellte Bilder zuordnen können. Fast google hat keine Dokumentation dafür verfasst, aber anscheinend haben die Leute es erfolgreich gemacht https://stackoverflow.com/questions/12355922/set-featured-image-for-wordpress-post-via-xml-rpc .

1
Mark Kaplun