在插入和更新自定义POST类型时调用函数

时间:2017-05-13 作者:Abilash Erikson

这里我有一个自定义的帖子类型products 分类法是product_categories . 我需要的是,每当我在产品中添加帖子时,我需要调用function1,当我更新帖子时,我需要调用function2。如何做到这一点?

我在google上搜索并找到了以下解决方案:

add_action(\'save_post\', \'save_in_filter\', 10, 2);
        function save_in_filter($post_id, $post){
          function1();  
        }


 function mynewproduct(){
    myfunction();
}
但是,当我单击add new post时,function1()突然执行,但我需要的是function1在插入数据之后执行,而不是在插入数据之前执行。

将帖子添加到产品时(post_type=products) 我需要执行function1(). 当在我需要执行的产品中更新帖子时function2(); 为什么?post_updated,save_post 功能工作不正常?

3 个回复
最合适的回答,由SO网友:Picard 整理而成

This is the original answer but it is little faulty, look below for the updated

您可以使用以下方法。

这个my_action_updated_post_meta 在完成后期插入或更新后执行:

// define the updated_post_meta callback
function my_action_updated_post_meta( $array, $int, $int ) {
    global $post;

    // see your updated post
    print_r($post);

    // make your action here...
    die(\'after update\');
};

// add the action
add_action( \'updated_post_meta\', \'my_action_updated_post_meta\', 10, 3 );
这是函数的documentation page.

Update

我注意到上面的回答有点错误updated_post_meta 在管理面板中打开post for edition时也会触发操作(用于帖子更新)(因为_edit_lock 即使当时没有做出真正的改变。

所以我改变了方法。

我使用全局变量$my_updated_flag 知道已经发生了“真正的”变化。我通过将此变量设置为“1”post_updated 行动所以如果$my_updated_flag == 1 我们知道这不仅仅是_edit_lock 改变要区分插入后操作和更新后操作,请检查$post->post_status == \'draft\' 由于新职位在现阶段处于“草稿”状态。

$my_updated_flag = 0;

// define the updated_post_meta callback
function action_updated_post_meta( $meta_id, $post_id, $meta_key, $meta_value = \'\' ) {
    global $post, $my_updated_flag;

    if ($my_updated_flag == 1) {
        if ($post->post_status == \'draft\') {
            die(\'post_inserted\');
        } else {
            die(\'post_updated\');
        }
        $my_updated_flag = 0;
    }
};
add_action( \'updated_post_meta\', \'action_updated_post_meta\', 10, 4 );

function action_post_updated( $array, $int, $int ) {
    global $my_updated_flag;
    $my_updated_flag = 1;
};
add_action( \'post_updated\', \'action_post_updated\', 10, 3 );

SO网友:Justin

看看post_updated 例如挂钩。。

// Hook to all private or public post types updating
add_action( \'post_updated\', \'my_function\' );    

function my_function( $post_id ){

    $post_status = get_post_status( $post_id );

    switch ( $post_status ) {
        case \'draft\':
        case \'auto-draft\':
        case \'pending\':
        case \'inherit\':
        case \'trash\':
            return;

        case \'future\':
        case \'publish\':
        case \'private\':
            // continue

    }

   \'do something; 
}

结束

相关推荐

我可以使用MySQL查询来取代Query_Posts()吗?

我有一个模板,似乎只接受给定的变量query_posts(), 这看起来像get_posts(), 但这太限制了。所以我要做的就是query_posts() 或者找到一种包含过滤器的方法,如在此元键的元值中包含多个值中的一个或多个值的帖子,以及在其元键中包含此值的作者在里面。到目前为止,我两个都没有成功。有什么可以帮助我的吗?