web-dev-qa-db-ja.com

Add_action( 'publish_postまたはadd_filter(' publish_postを使用する必要がありますか。

特定のカスタム投稿タイプが公開されたらすぐに追加機能を起動しようとしています

function insert_table_products($post_id, $post) {
    if ($post->post_type == 'custom-products') {
        global $wpdb;
        $custom_meta = get_post_meta($post_id);
        //print_r($custom_meta);
        //print_r($post);
        $attachments = new Attachments('my_attachments');
        if ($attachments->exist()) :
            $my_index = 0;
            $use_image = new SplFileInfo($attachments->url($my_index));
            $use_main_image = $use_image->getFilename();
        endif;

        $wpdb->insert(
                'products', array(
            'product_code' => $custom_meta['product_code'][0],
            'product_name' => $post->post_title,
            'product_img_name' => $use_main_image,
            'price' => $custom_meta['product_price'][0], //$POST['acf-field-price_patch'],
            'product_inventory' => $custom_meta['product_stock'][0], //$POST['fields[field_54df75e760b5e]'],
                )
        );
    }
}
add_filter('publish_post', 'insert_table_products', 10, 2);
//add_action( 'publish_post', 'insert_table_products', 10, 2);

どちらのフックも機能しません。私はprint_rがいくつかのデータを表示することを期待していました

ところで、私はまたによって引き起こされる更新機能を、持っています

//add_filter('edit_post', 'update_table_products', 10, 2);

これもまた正しく動作しないようです。

何か案は?

1
alex

publish_postはカスタム投稿タイプでは動作しません。正しいフック(アクションフック)はpublish_{$custom_post_type}です。これはアクションフックなのでadd_action()を使うべきです。

私はまたtransition_post_statusフックを利用する傾向があります。これは投稿のステータスが変更される度に変更されるたびに起動されるので、もっと普遍的なフックです。 $old_status$new_statusを使って、投稿の前のステータスと新しいステータスをチェックしてから何かをすることができます。

新しい投稿の場合は、次のようになります。(PHP 5.3 +が必要です)

add_action( 'transition_post_status', function ( $new_status, $old_status, $post )
{

    if( 'publish' == $new_status && 'publish' != $old_status && $post->post_type == 'my_post_type' ) {

        //DO SOMETHING IF NEW POST IN POST TYPE IS PUBLISHED

    }
}, 10, 3 );

編集

transition_post_statusを使用して投稿の編集/更新をすることができます。

add_action( 'transition_post_status', function ( $new_status, $old_status, $post )
{

    if( 'publish' == $new_status && 'publish' == $old_status && $post->post_type == 'my_post_type' ) {

        //DO SOMETHING IF A POST IN POST TYPE IS EDITED

    }
}, 10, 3 );

投稿ステータスの移行に関する詳細については、 コーデックス をチェックしてください。

編集2

高度なカスタムフィールドプラグインで構築されたカスタムフィールド、および移行後に実行される save_post フックを使用するため、カスタムフィールドを追加しようとしてもここでは機能しません。

カスタム投稿タイプのために、物事を簡単にするために save_{$post_type} と呼ばれる新しいフックが導入されました。このフックは、カスタムフィールドを更新するためにACFフォーラムによっても推奨されています。

5
Pieter Goosen