自定义POST类型SAVE_POST操作未触发

时间:2012-12-10 作者:JamieCassidy

抱歉,如果这里已经回答了这个问题。我环顾四周,看不到我的问题的任何答案,所以我想我应该发布自己的答案。

我正在为客户构建一个插件,收集客户对最近完成的项目的反馈。

管理员将使用该系统向客户发送“提示”,要求他们提供反馈,并在网站上链接表单。

我创建了一个名为“customer\\u prompts”的自定义帖子类型,它只有一个标题字段和几个自定义字段,这些字段存储在自定义数据库表中,而不是post meta中。

下面是我的save\\u post操作代码。似乎当我点击publish时,它不会启动save\\u post操作,只会将标题值保存到wp\\u posts。

add_action(\'save_post\', \'save_prompt\');
function save_prompt($post_id){
$post = get_post($post_id);

    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) 
          return;

    if ( \'customer_prompt\' == $_POST[\'post_type\'] ) 
    {
        if ( !current_user_can( \'edit_page\', $post_id ) )
            return;
    }
    else
    {
        if ( !current_user_can( \'edit_post\', $post_id ) )
        return;
    }

    global $wpdb;

    $prompt_id = com_create_guid();
    $customer_feedback_name = $_POST[\'_sdg_customer_feedback_name\'];
    $customer_feedback_email = $_POST[\'_sdg_customer_feedback_email\'];
    $salesperson = $_POST[\'_sdg_salesperson\'];

    $values = array(
        \'id\' => $prompt_id, 
        \'sdg_customer_name\' => $customer_feedback_name,
        \'sdg_customer_email\' => $customer_feedback_email,
        \'sdg_salesperson\' => $salesperson,
        \'sdg_post_id\' => $post->id
    );

    $insert = $wpdb->insert($table_name, $values);

    if($insert) {
        mail($customer_feedback_email, \'hello\', \'hello\');
    }

}
任何帮助都将不胜感激,因为我不知道这里发生了什么。

谢谢,杰米。

6 个回复
SO网友:revo

“save\\u post”操作仅在我们实际更改了post页面表单中的某些内容时调用。如果只按更新按钮,而不更改任何内容,则不会调用“save\\u post”操作。

如果我们正在编辑一个有自定义元框的自定义帖子类型,这一点很重要。如果我们依赖“save\\u post”操作,只更改自定义元框上的内容,那么什么都不会发生。

解决方案是使用“pre\\u post\\u update”操作挂钩,而不是“save\\u post”

http://wordpress.org/support/topic/save_post-not-working-getting-called#post-2335557

SO网友:Caleuanhopkins

编辑您是否尝试放置print_r(\'hello world\'); die(); 之后function save_prompt($post_id){ 要确保函数确实被动作挂钩拾取/编辑

可能存在以下几个问题:

1: 您的global wpdb 需要位于函数的最顶端,在所有if条件语句之前。

2: 您的$_POST 变量的条件应为if(isset($_POST[\'food\')) 检查正在发布的数据是否在到达您的函数之前实际设置,否则可能会导致致命错误,导致数据无法输入数据库。

3: 试试看global $post 在函数顶部,您可以调用post的变量,例如$post->post_type 通过$post 变量

4: 添加 $wpdb->print_errors; die(); 之后$insert = $wpdb->insert($table_name, $values); 如果数据库查询不正确。

希望其中一个可以解决您的问题。

SO网友:WP Themes

首先,我建议您将WordPress站点设置为易于调试http://codex.wordpress.org/Debugging_in_WordPress

这样,很容易看到东西。)

对于动作挂钩,我相信你需要这样挂钩:

add_action(\'save_post\', \'save_prompt\', 10, 2);
function save_prompt( $post_id, $post ){
//do whatever
}
thesave_post 钩子传递2个参数。

SO网友:Vic

这发生在我身上。事实证明,我有一个页面模板集(一个用于_wp_page_template) 切换主题后,转到不再存在的模板。这段代码wp-includes/post.php:

if ( ! empty( $postarr[\'page_template\'] ) ) {
    $post->page_template = $postarr[\'page_template\'];
    $page_templates = wp_get_theme()->get_page_templates( $post );
    if ( \'default\' != $postarr[\'page_template\'] && ! isset( $page_templates[ $postarr[\'page_template\'] ] ) ) {
        if ( $wp_error ) {
            return new WP_Error( \'invalid_page_template\', __( \'Invalid page template.\' ) );
        }
        ...
点火前中止save_post.

SO网友:Futz

我认为add\\u操作中的var\\u dump(\'save\\u post\',回调函数没有显示!

添加

$fp = fopen(\'c:\\data.txt\', \'w\');
fwrite($fp, print_r($post_id, true));
fclose($fp);
并检查“是否”数据。txt’存在,是的,save\\u post为真。

:)

SO网友:user3381109

我也有这个确切的问题,我想我应该补充一下潜在的答案,以帮助节省一些时间。这是一个非常简单的问题,我花了好几天的时间才确定(我“现在有点犹豫不决,觉得有点傻)。。。

事实证明,正在生成的元数据库表单包含一个“操作”字段,该字段覆盖了WordPress生成表单的“操作”字段-该表单仅用于自定义贴子,因此错误的操作被传递给了WordPress on post to\'wp-admin/post.php\' 它最终由默认处理程序处理(在switch语句的末尾)。

另一个副作用是,在更新或发布时,WordPress重定向到内置的帖子索引,而不是直接返回到已编辑的帖子。

解决方案是删除metabox的“action”隐藏表单元素。

我希望这能帮助别人。。。

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $