web-dev-qa-db-ja.com

XMLRPCとアンダースコアのカスタムフィールド

デスクトップからすべてのブログを自動化するためのアプリケーションを作成していました。ターゲット、ブログを投稿します。それで全部です。あなたが "xmlrpc.php"を知っているように、私はXMLRPCserviceを使いました。

私はほとんど完成していない部分を作成しました...しかし、アンダースコア(_)で始まるカスタムフィールドにこだわっていました。 "_thumbnail_id" =>(int)の番号で保存したいのですが。何も起こらなかった。

しかし、私が "thumbnail_id"またはそのようなものを試したときに、アンダースコアで始めなかった。大丈夫です。うまく機能しますが、下線で始めます...

投稿の特集画像を決めるために必要です。そのタグがなければ。できませんでした。そして私は代替案を知りません。

私はこれを見つけます: https://wordpress.org/support/topic/how-can-i-change-protected-params-xmlrpc しかし私の問題を解決していません。ワードプレスファイルを変更したくありません。必要な場合は、RPCなしで小さなスクリプトを書くことができます。

どんな手助けもファンタスティックになります!

3

XML-RPCと強調されたカスタムフィールドで遊ぶ:

$remote_post_idを使って注目の画像を特定の投稿に設定したいとしましょう。

これを300と等しいIDの添付ファイルにしたいので、_thumbnail_id300にします。

これを実現する方法は3つあります。

方法1 - post_thumbnailを使う

post_thumbnailパラメータで注目の画像を更新/追加することは可能です。

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

[wp_xmlrpc_server] [1]クラスに見られるように。

方法2 - custom_fieldsmeta_idの併用

投稿のカスタムフィールドを更新したい場合は、それがデータベースのmeta_id値であることを知っておく必要があります。

しかし、どのようにしてmeta_idを知るのでしょうか。

次のように投稿を取得すると、カスタムフィールドは実際にはデフォルトで含まれます。

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

投稿におすすめの投稿サムネイルがある場合、上記の結果にはこの部分が含まれます。

<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は、例えば560で、古いmeta_value200です。

これで_thumbnail_idのメタ値を新しい値で更新できます。

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

meta_idの部分を飛ばした場合、 this trac で導入された[add_post_meta()] [2]の代わりに、update_metadata_by_mid()のみを実行することに注意してください。edit_post_metaの機能も必要です。

アンダースコア(_)で始まるメタキーはprotectedなので、これだけではありません。

リモートサイトで[register_meta()] [3]関数を使うことでそれを修正できます。

例えば:

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

_thumbnail_idメタキーの保護を解除します。最初にintvalをサニタイズコールバックとして試しましたが、うまくいきませんでした。

他の保護されたメタキーにも同様の設定を使用できます。

方法3カスタムXML-RPC方法を使用する。

@MarkKaplunが彼の答えで述べたように、私たちは私たちのニーズにXML-RPC設定を拡張することができました。例えばxmlrpc_methodsフィルタを使って独自のメソッドを追加することができます。

コーデックス はそのことに関するより多くの情報を提供します。

参考文献:

これをテストしている間私を助けたいくつかのリンクはここにあります:

3
birgire

アンダースコア化メタデータは、ソフトウェアの内部にあり、ユーザによって直接変更されないデータであると定義されます。おそらくこれがXMLRPCで変更できない理由です。

この種の機能が必要な場合は、XMLRPCで変更できるデータのセットを拡張する小さなプラグインを書くことができます。

しかし、あなたが質問するのは特に注目の画像に関するものなので、添付ファイルを注目の画像として関連付けることができるAPIを探す必要があります。 Fast googleはそのための文書を何も出しませんでしたが、人々はそれをうまくやったようです https://stackoverflow.com/questions/12355922/set-featured-image-for-wordpress-post-via-xml-rpc

1
Mark Kaplun