web-dev-qa-db-fra.com

Champs personnalisés XMLRPC et Underscored

Je créais mon application pour automatiser tous mes blogs à partir de mon bureau. Cible, je posterai un blog. C'est tout. J'ai utiliséXMLRPCservice, comme vous le savez "xmlrpc.php".

J'ai construit beaucoup de pièces, presque terminées ... Mais coincées dans des champs personnalisés commençant par (_) un trait de soulignement. Je voudrais enregistrer sous "_thumbnail_id" => (int) nombre. Rien ne s'est passé.

Mais quand j'ai essayé "thumbnail_id" ou quelque chose comme ça sans commencer par le trait de soulignement. C'est bon. Travaille bien mais commence par un trait de soulignement ...

J'en ai besoin pour déterminer l'image sélectionnée de l'article. Sans cette balise; Je ne pouvais pas Et je ne connais pas d'alternative.

Je trouve ceci: https://wordpress.org/support/topic/how-can-i-change-protected-params-xmlrpc Mais je ne résous pas mon problème. Je ne veux pas changer les fichiers wordpress. Si nécessaire, je peux écrire un petit script sans RPC.

Toute aide sera fantastique!

3
Erçin Dedeoğlu

Jouer avec XML-RPC et les champs personnalisés soulignés:

Supposons que nous voulions définir l'image sélectionnée pour un message donné avec $remote_post_id.

Nous voulons que ce soit la pièce jointe avec un ID égal à 300, nous voulons donc que _thumbnail_id soit 300.

Voici trois méthodes pour y parvenir:

Méthode n ° 1 - Utiliser post_thumbnail

Il est possible de mettre à jour/ajouter l'image sélectionnée avec le paramètre post_thumbnail:

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

comme on peut le voir [ici dans la classe wp_xmlrpc_server] [1].

Méthode n ° 2 - Utiliser custom_fields avec meta_id

Si nous voulons mettre à jour un champ personnalisé d'une publication, nous devons savoir qu'il s'agit de la base de données meta_id value.

Mais comment connaissons-nous le meta_id?

Les champs personnalisés sont en fait inclus par défaut lorsque nous récupérons un message avec:

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

Si la publication comporte une miniature de publication sélectionnée, le résultat ci-dessus contiendra cette partie:

<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>

meta_id est par exemple 560 et l'ancien meta_value est 200.

Nous pouvons maintenant mettre à jour la méta valeur de _thumbnail_id avec notre nouvelle valeur:

$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 
                )
            ),
        ),
    ) 
);

Notez que si nous ignorons la partie meta_id, nous n'exécuterions que add_post_meta(), à la place de la [update_metadata_by_mid()] [2] introduite dans this trac . Nous devons également avoir la capacité edit_post_meta .

Mais ce n’est pas toute l’histoire, car les méta-clés qui commencent par un trait de soulignement (_) sont protected .

Nous pouvons résoudre ce problème en utilisant la fonction [register_meta()] [3] sur le site distant.

Par exemple:

/**
 * 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' );
});

pour déprotéger la clé méta _thumbnail_id. J'ai d'abord essayé la intval comme rappel de désinfection, mais cela n'a pas fonctionné.

Nous pourrions utiliser une configuration similaire pour d’autres clés méta protégées.

Méthode n ° 3 Utilisation d'une méthode XML-RPC personnalisée.

Comme @MarkKaplun l'a mentionné dans sa réponse, nous pourrions étendre la configuration XML-RPC à nos besoins. Nous pourrions par exemple utiliser le filtre xmlrpc_methods pour ajouter notre propre méthode.

Le Codex fournit plus d’informations à ce sujet.

Références:

Voici quelques liens qui m'ont aidé à tester ceci:

3
birgire

Les métadonnées en caractères indéfinis sont définies comme des données internes au logiciel et non modifiées directement par un utilisateur. C'est probablement pourquoi vous ne pouvez pas le changer via XMLRPC.

Si vous avez besoin de ce type de fonctionnalité, vous pouvez écrire un petit plugin qui étend le jeu de données que vous pouvez modifier avec XMLRPC.

Mais puisque votre question concerne spécifiquement les images en vedette, vous devez rechercher une API permettant d'associer une pièce jointe à une image en vedette. Fast google n’a fourni aucune documentation à ce sujet, mais il semble que les gens l’aient fait avec succès https://stackoverflow.com/questions/12355922/set-featured-image-for-wordpress-post-via-xml-rpc .

1
Mark Kaplun