web-dev-qa-db-ja.com

カスタム投稿タイプのメタデータのリビジョンを保存する

カスタム投稿タイプのメタデータを保存するのは簡単です。これを処理するメソッドに 'save_post'のアクションを追加するだけです。その中に、あなたが(もちろん通常のセキュリティチェックと共に)保存したいフィールドのために次のような何かを持っている:

update_post_meta( $post_id, '_description', $_POST['_description'] );

とても簡単です。しかし、WordPressがカスタム投稿のリビジョンを保存するために必要な作業を理解することはできません。

カスタム投稿タイプの改訂を有効にし、 'title'などの標準フィールドの改訂を有効にします。しかし、メタデータに対してはデフォルトでは機能しません。

私は他の人々がこれをどのようにして行うか探し、そしてほとんど全員が次のコードスニペットを渡します。

function my_plugin_save_post( $post_id, $post ) {

    if ( $parent_id = wp_is_post_revision( $post_id ) ) {

        $parent  = get_post( $parent_id );
        $my_meta = get_post_meta( $parent->ID, 'my_meta', true );

        if ( false !== $my_meta )
              add_metadata( 'my_custom_post', $post_id, 'my_meta', $my_meta );
    }

} add_action( 'save_post', 'my_plugin_save_post' );

しかし、これは私にとってはうまくいきません。メタデータフィールドの1つを変更しても、リビジョンリストに新しいリビジョンが表示されません。たとえばカスタム投稿のタイトルを変更すると、新しいリビジョンが表示されます。

私が普段メタデータを保存する方法と比較してこれをどのように行うべきかについての詳細にはなじみがありません。それとも私はこの風邪のために何かが足りないのです。

カスタム投稿メタデータのリビジョンを保存するために必要なことの良い例は誰かありますか?

6
FuzzyYoda

あなたがアクセスできる(してはいけません)プライベートフィルタがあります:

wp-includes/revision.phpで定義されています。

/**
 * Filter the list of fields saved in post revisions.
 *
 * Included by default: 'post_title', 'post_content' and 'post_excerpt'.
 *
 * Disallowed fields: 'ID', 'post_name', 'post_parent', 'post_date',
 * 'post_date_gmt', 'post_status', 'post_type', 'comment_count',
 * and 'post_author'.
 *
 * @since 2.6.0
 * @since 4.5.0 The `$post` parameter was added.
 *
 * @param array $fields List of fields to revision. Contains 'post_title',
 *                      'post_content', and 'post_excerpt' by default.
 * @param array $post   A post array being processed for insertion as a post revision.
 */
$fields = apply_filters( '_wp_post_revision_fields', $fields, $post );

だからあなたはのような関数を書くことができます

add_filter( '_wp_post_revision_fields', 'add_my_own_fields', 10, 2 );

function add_my_own_fields( $fields, $post ) {
    $fields['meta_field'] = 'Meta Field';
}

ここでmeta_fieldはあなたが修正したいメタのキーで、'Meta Field'はリビジョンUIの見出しとして表示されるものです。

お願いしますこれは非公開であり、使用はテーマまたはプラグイン開発者向けのnotです。この問題を回避するにはもっと複雑な解決策が必要になるでしょうし、それらの問題にも対応できるプラグインを使うのがよいでしょう。

1
phatskat