自定义邮件类型上的Meta Box未保存

时间:2011-01-22 作者:George Wiscombe

我有一个自定义的帖子类型,它工作得很好,但是元框没有保存。

长(&A);肖特,我被难住了!

add_action(\'init\', \'portfolio\');
function portfolio() {
 $args = array(
  \'label\' => __(\'Portfolio\'),
  \'singular_label\' => __(\'Portfolio\'),
  \'public\' => true,
  \'show_ui\' => true,
  \'menu_position\' => 5,
  \'capability_type\' => \'page\',
  \'hierarchical\' => false,
  \'rewrite\' => true,
  \'show_in_nav_menus\' => true,
  \'supports\' => array(\'title\', \'editor\', \'thumbnail\', \'excerpt\'),
  \'has_archive\' => true
 );

 register_taxonomy( \'type\', \'portfolio\',
  array(
             \'hierarchical\' => false,
    \'label\' => __(\'Project Type\'),
    \'query_var\' => \'type\',
    \'rewrite\' => array(\'slug\' => \'portfolio/type\' )
  )
 );

 register_post_type( \'portfolio\' , $args );
}

add_action("admin_init", "admin_init");
add_action(\'save_post\', \'save_meta_data\');

function admin_init(){
add_meta_box("portfolio_text", "Main Text", "portfolio_options", "portfolio", "normal", "high");
}

/* Meta Values for Shorts */
function portfolio_options() {
 global $post;
 $custom = get_post_custom($post->ID);
 $short_embed = $custom["portfolio_text"][0]; ?>
 <textarea name="portfolio_text" cols="40" rows="1" style="width:98%; height:100px"/><?php echo get_option(\'portfolio_text\'); ?></textarea> 
<?php }


/* Save Changes */
function save_meta_data($ID = false, $post = false) {
    if($post->post_type != \'portfolio\')
        return;
    update_post_meta($ID, \'portfolio_text\', $_POST[\'portfolio_text\']);
}
非常感谢您的帮助!

干杯,乔治

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

你好@George Wiscombe:

如此接近,却又如此遥远(我知道痛苦,我经常在那里。:)你差点就受了,但使用了错误的挂钩来进行后期元更新。使用\'wp_insert_post_data\' 钩子而不是\'save_post\' 挂钩:

<?php
if (!class_exists(\'YourSite_Portfolio\')) {
  class YourSite_Portfolio {
    static function on_load() {
      add_action(\'init\',array(__CLASS__,\'init\'));
      add_action("admin_init",array(__CLASS__,\'admin_init\'));
      add_action(\'wp_insert_post_data\',array(__CLASS__,\'wp_insert_post_data\'),10,2);
    }
    static function init() {
      register_post_type( \'portfolio\',array(
        \'label\' => __(\'Portfolio\'),
        \'singular_label\' => __(\'Portfolio\'),
        \'public\' => true,
        \'show_ui\' => true,
        \'menu_position\' => 5,
        \'capability_type\' => \'page\',
        \'hierarchical\' => false,
        \'rewrite\' => true,
        \'show_in_nav_menus\' => true,
        \'supports\' => array(\'title\', \'editor\', \'thumbnail\', \'excerpt\'),
        \'has_archive\' => true
      ));
      register_taxonomy( \'type\', \'portfolio\', array(
        \'hierarchical\' => false,
        \'label\' => __(\'Project Type\'),
        \'query_var\' => \'type\',
        \'rewrite\' => array(\'slug\' => \'portfolio/type\' )
      ));
    }
    static function admin_init(){
      add_meta_box(\'portfolio_text\',\'Main Text\',array(__CLASS__,\'portfolio_options\'),\'portfolio\',\'normal\',\'high\');
    }
    static function portfolio_options($post,$metabox) {
      $portfolio_text =  get_post_meta($post->ID,\'portfolio_text\',true);
    $html =<<<HTML
<textarea name="portfolio_text" cols="40" rows="1" style="width:98%; height:100px"/>{$portfolio_text}</textarea>
HTML;
      echo $html;
    }
    static function wp_insert_post_data($data,$postarr) {
      if ($postarr[\'post_type\'] == \'portfolio\') {
        update_post_meta($postarr[\'ID\'], \'portfolio_text\', $postarr[\'portfolio_text\']);
      }
      return $data;
    }
  }
  YourSite_Portfolio::on_load();
}
The\'wp_insert_post_data\' 钩子是WordPress从$_POST 大堆当你到达\'save_post\' WordPress重新加载了帖子,这就是为什么\'portfolio_text\' 尝试保存时清空。

SO网友:Bainternet

这一行中的portfolio\\u options函数存在问题:

<textarea name="portfolio_text" cols="40" rows="1" style="width:98%; height:100px"/><?php echo get_option(\'portfolio_text\');** ?></textarea> 
它正在被保存,以前也有过,但您没有用正确的方式调用它,您正在使用get_option(\'portfolio\\u text\'),这是不对的,因为它不是一个选项,而是一个post元数据

因此,将get\\u选项(\'portfolio\\u text\')更改为get\\u post\\u meta($post->ID,\'portfolio\\u text\',true);

因此,您的函数如下所示:

/* Meta Values for Shorts */
function portfolio_options() {
 global $post;
 $custom = get_post_custom($post->ID);
 $short_embed = $custom["portfolio_text"][0]; ?>
 <textarea name="portfolio_text" cols="40" rows="1" style="width:98%; height:100px"/><?php echo get_post_meta($post->ID, \'portfolio_text\', true); ?></textarea> 
<?php }
应该这样!

结束

相关推荐

在帖子类型/MetaBox中使用默认WordPress自定义标题图像裁剪功能

我不知道你们中有多少人尝试过wordpress 3.0新的自定义标题图像功能,但它实际上非常酷(通过将该函数添加到functions.php文件来实现)。我发现非常有用的一件关键事情是,它允许您上载图像,在步骤2,它实际上会将图像放在管理页面上,并根据您的函数中定义的标题图像宽度/高度显示裁剪框。php文件。现在,您可以四处移动长方体,或按比例增大/减小要使用的区域的大小。我在这里遇到的问题是,我想将此功能用于我自己的自定义帖子类型。更具体地说,我只是希望能够包括上传功能,定义宽度/高度和图像上传后的选择