0

我目前正在开发一个 wordpress 插件。该插件包括一个数据库表,每次使用该帖子的数据创建、编辑或删除帖子时都会更新该表。此表中的一列是“post_status”,我需要在帖子更改时使用帖子状态对其进行更新。现在我正在使用这段代码:

function filter_transition_post_status( $new_status, $old_status, $post ) { 
    global $post;
    global $wpdb;
    $wpdb->query(" UPDATE my_table SET post_status='$new_status' WHERE post_id=$post->ID");
}
add_action('transition_post_status', 'filter_transition_post_status', 10, 3);

当我在“编辑帖子”页面中更改帖子状态时,上面的代码工作正常。当我更改帖子的状态时,更改也会发生在我的表格中。但是,当我使用“快速编辑”模式更改帖子状态或批量更改多个帖子时,代码不起作用。我的桌子上没有发生变化。任何解决此问题的帮助将不胜感激。谢谢你

4

1 回答 1

0

我找到了解决方案。当使用“快速编辑”模式更新帖子时,无法像在“编辑帖子”页面中那样使用全局 $post 来检索帖子 ID,而是使用 $_GET['ID']。因此,为了涵盖“快速编辑”和“编辑帖子”这两个选项,我使用以下功能:

function filter_transition_post_status( $new_status, $old_status, $post ) { 
    global $wpdb;
    global $post;
    $my_id = get_post($_GET['ID']);
    is_array($my_id) ? $post_id = $my_id[ID] : $post_id = $post->ID;
    $wpdb->query(" UPDATE my_table SET post_status='$new_status' WHERE post_id=" .$post_id);
}
add_action('transition_post_status', 'filter_transition_post_status', 10, 3);

该函数检查 $my_id 是否从 $_GET[ID](在“快速编辑”页面中)得到任何东西,如果是,它将使用它,否则它将使用全局 $post 来获取 id。

更新:

我得到了比斯蒂芬哈里斯更好的解决方案- “你不想引用全局 $post,但作为参数之一给你的帖子。你只需要删除全局 $post”

function wpse50651_filter_transition_post_status( $new_status, $old_status, $post ) { 

    global $wpdb;

    $wpdb->query( 
        $wpdb->prepare( 
          "UPDATE my_table SET post_status=%s WHERE post_id=%d", 
           $new_status,$post->ID
         ) 
     );
}
add_action('transition_post_status', 'wpse50651_filter_transition_post_status', 10, 3);
于 2012-05-01T04:08:41.670 回答