保存草稿时需要执行什么操作?

时间:2011-04-13 作者:GorillaPatch

我想根据自定义元框中的复选框向当前帖子添加一个元数据字段,以便能够逐个帖子切换我的自定义插件。

为此,我编写了以下代码

在新帖子和新页面上生成元框处理元框中复选框的值,并相应地设置帖子或页面的元数据。但我对2号有问题。我有以下代码来处理元数据的设置:

根据元框中复选框的值更新元数据

// register action
add_action( \'save_post\', \'cl_save_postdata\');
/* When the post is saved, saves our custom data */

function cl_save_postdata( $post_id ) {
  // check if $post_id is just a revision id and if so get the parent id
  if($parent_id = wp_is_post_revision($post_id)){
    $post_id = $parent_id;
  }  
  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( EMU2_I18N_DOMAIN, plugin_basename(__FILE__) ) )
      return $post_id;
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) 
      return $post_id;

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

  // OK, we\'re authenticated: we need to find and save the data

  if ($_POST[\'cl-activated\']) {
     add_post_meta( $post_id, \'cl-activated\', true, true) or update_post_meta( $post_id, \'cl-activated\', true);
  } elseif (get_post_meta ($post_id, \'cl-activated\', true)) {
    delete_post_meta( $post_id, \'cl-activated\');
  }
  return $cl_is_activated;
}
此代码的思想是根据复选框值设置或取消设置“cl激活”元数据。元框的形式如下:

生成内部元框HTML

function cl_generate_inner_box($post, $metabox) {
      // Use nonce for verification
  wp_nonce_field( plugin_basename(__FILE__), EMU2_I18N_DOMAIN );

  // The actual fields for data entry
  echo \'<label for="cl-activated">\';
       _e("Activate collect links", EMU2_I18N_DOMAIN );
  echo \'</label> \';
  echo \'<input type="checkbox" id="cl-activated" name="cl-activated" value=\'.$metabox[\'args\'][\'cl-parameter-name\'];
  if (get_post_meta($post_id, \'cl-activated\', true)==true) {
    echo \' checked="checked"\';
  }
  echo \' />\';
}
我的问题未设置帖子的元数据。我尝试在数据库中的wp POSTETA表中查找元数据,但无论我做什么,元数据都不存在save_post 就像我现在所做的那样,我的印象是,只有当帖子已经发布时才会调用它

编辑

The first problem is solved. 我仔细检查了Wordpress提供的过渡挂钩。在我看来save_post 当我编辑帖子时,钩子应该被激活。但是,当我单击new post(新建帖子)按钮时会调用它,而当我将帖子另存为草稿时不会调用它。

为了清除,我需要一个钩子,允许我在用户更改帖子上的任何内容时执行一个函数,以查看我的自定义复选框是否已更改,以便我可以相应地更新帖子的元数据。

1 个回复
SO网友:bueltge

WP 2.3之后,所有状态都有一个挂钩:{$new_status}_{$post->post_type}

或者,您可以使用ans if作为hook save\\u post上的状态;例如,对于post\\u类型post,您可以将此“post”更改为您的post\\u类型或默认表单WP:

    public function set_status_private($id, $post) {

        if ( is_object($post) && 
             \'post\' === $post->post_type && 
             \'publish\' === $post->post_status
            ) {
            $post->post_status = \'private\';

            wp_update_post($post);
        }
    }
我希望这对你有帮助。

结束

相关推荐

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( $