web-dev-qa-db-ja.com

既存のWordPressの一括操作にどのようにフックできますか?

SQLクエリを使用して、投稿編集ページのカスタムメタボックス内の標準の[WPデータとカスタムフィールドの両方を外部リソースに同期するプラグインを作成しています。しかし、私の機能は現在、単一の投稿を管理しているときにのみ機能しており、既存の一括操作(ゴミ箱へ移動、ゴミ箱からの復元、および編集)のサポートを追加しようとしています。今のところ私のsync関数はsave_postにフックされていて、 'wp_trash_post'を使って外部リソースから削除し 'untrashed_post'を使って再挿入するためのサポートを追加しました。ゴミ箱の後の管理者通知)これが私のadd metaboxクラスの__constructにあるコードです。

add_action( 'save_post', array( $this, 'save_post_function' ) ); //which eventually calls myOtherClass::runs_sync_to_external_resource_SQL_query($post_id);
add_action( 'wp_trash_post', 'my_delete_function' );
function my_delete_function( $post_id ){
    myClass::runs_delete_from_resource_SQL_query($post_id);
}
add_action( 'untrashed_post', 'my_undelete_function' );
function my_undelete_function($post_id) {
    myOtherClass::runs_sync_to_external_resource_SQL_query($post_id);
}

私は カスタムバルクアクションを追加することについてのこのブログ投稿 を読んだことがあります(これはトピックに関する参考になるようです)。一括アクションを選択してドロップダウンを変更してカスタムアクションを追加する必要はありませんが、既存のゴミ箱にフックして一括アクションを復元するだけです。

さらに、外部リソースに同期されているデータの一部(カテゴリ、タグ、投稿フォーマット、投稿ステータス)を編集できるため、[一括編集]アクションにフックする必要があります。

最後に、復元機能を実行するには[元に戻す]ボタンをクリックする必要があります。私はそれがうまくいっていないのではないかと思います。

何かアドバイス?前もって感謝します

編集:これはステータス遷移フックを使用して上記から修正されたコードです:

add_action( 'save_post', array( $this, 'save_post_function' ) ); //which eventually calls pluginname_sync::pluginname_syncpost($post->ID);
add_action( 'transition_post_status', 'cp_sync', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {
            if ( $old_status == 'publish'  &&  $new_status != 'publish' ) {
                pluginname_sync::pluginname_delete($post->ID);
            }
            if ( $old_status != 'publish'  &&  $new_status == 'publish' ) {
                pluginname_sync::pluginname_syncpost($post->ID);
            }
        }
1
T Andrew

あなたが説明したように、あなたは投稿がゴミ箱に入れられたとき、編集されたとき、または未開封のときにデータを同期したいと思います。 save_postアクションを試していますが、投稿編集画面でのみ起動します(codexによると、このアクションは読み込み、投稿/ページ編集フォーム、xmlrpc、または電子メールによる投稿で起動します)アクションとクイック編集があなたは間違っています。一括編集またはクイック編集で投稿を編集したときに発生する特別な保存操作はありません(カスタム一括操作の追加について投稿したリンクは、事前定義の一括操作でタスクを実行するためではなく、カスタム一括操作を追加するためです)。

私の観点からは、データの同期以外に投稿ステータスの移行に適したものはありません。

あなたはポストステータス遷移を試みましたが、間違った論理を持っています。たとえば、投稿が公開から非公開に遷移するときにde delete sync関数を実行すると、投稿が削除されるわけではありません。公開されていない投稿をゴミ箱に入れる、下書き、将来の投稿などにできます。

いくつか例を見てみましょう。

add_action( 'transition_post_status', 'cp_sync', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {

    // Check $old_status also if you need specific actions
    // when the post transits from a specific status

    if ( $new_status == 'draft' ) {
        // The post is now draft, no matter what status it had previously
        // sync draft posts here
    }

    if ( $new_status == 'publish' ) {
        // The post is now published, no matter what status it had previously
       // sync published posts here
    }

    if ( $new_status == 'trashed' ) {
        // The post is now in the trash, no matter what status it had previously
        // sync trashed posts here
    }

    // Cotinue checking more post statues if you need (future, private, etc)
    // For a complete list, see https://codex.wordpress.org/Post_Status_Transitions 

}

削除された投稿のステータス遷移はありません。delete_postアクションのドキュメントに記載されている アクションのいずれかを使用する必要があります 。投稿データをすべて取得する必要がある場合は、 before_delete_post を使用します。

add_action( 'before_delete_post', 'my_func' );
function my_func( $postid ){
    // Post has been deleted
    pluginname_sync::pluginname_delete( $postid );
}

編集

Exmpale:公開された投稿のみを同期し、残りを外部データベースから削除します。

add_action( 'transition_post_status', 'cp_sync', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {

    // This will cover the transition from any status to published,
    // including published to published.
    if ( $new_status == 'publish' ) {
        pluginname_sync::pluginname_syncpost($post->ID);
    } else {
        pluginname_sync::pluginname_delete($post->ID);
    }

}
add_action( 'before_delete_post', 'my_func' );
function my_func( $postid ){
    pluginname_sync::pluginname_delete( $postid );
}
1
cybmeta