自定义帖子类型忘记数据

时间:2012-02-14 作者:amphibious

我刚设置了一个自定义的帖子类型,主要是以下内容this tutorial.

我现在正在我的网站上设置东西,做了很多CSS修改之类的,每隔几分钟,帖子就会忘记自定义元框中的所有内容。

我确信我在add\\u action/update\\u post\\u meta部分中做了一些错误,但我不知道它是什么,因为我并不真正理解代码的全部功能。

无论如何,事情是这样的:

add_action(\'init\', \'portfolio_register\');

function portfolio_register() {

    $labels = array(
        \'name\' => _x(\'My Portfolio\', \'post type general name\'),
        \'singular_name\' => _x(\'Portfolio Item\', \'post type singular name\'),
        \'add_new\' => _x(\'Add New\', \'portfolio item\'),
        \'add_new_item\' => __(\'Add New Portfolio Item\'),
        \'edit_item\' => __(\'Edit Portfolio Item\'),
        \'new_item\' => __(\'New Portfolio Item\'),
        \'view_item\' => __(\'View Portfolio Item\'),
        \'search_items\' => __(\'Search Portfolio\'),
        \'not_found\' =>  __(\'Nothing found\'),
        \'not_found_in_trash\' => __(\'Nothing found in Trash\'),
        \'parent_item_colon\' => \'\'
    );

    $args = array(
        \'labels\' => $labels,
        \'public\' => true,
        \'publicly_queryable\' => true,
        \'show_ui\' => true,
        \'query_var\' => true,
        \'menu_icon\' => get_stylesheet_directory_uri() . \'/article16.png\',
        \'rewrite\' => true,
        \'capability_type\' => \'post\',
        \'hierarchical\' => false,
        \'menu_position\' => null,
        \'supports\' => array(\'title\',\'editor\',\'thumbnail\')
      ); 

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

register_taxonomy("portfolio_cat", array("portfolio"), array("hierarchical" => true, "label" => "Categories", "singular_label" => "Category", "rewrite" => true));

add_action("admin_init", "admin_init");

function admin_init(){
  add_meta_box("media_meta", "Media", "media_meta", "portfolio", "normal", "low");
  add_meta_box("highlights_meta", "Highlights", "highlights_meta", "portfolio", "normal", "low");
  add_meta_box("main_meta", "Main", "main_meta", "portfolio", "normal", "low");
  add_meta_box("tabbed_meta", "Tabbed", "tabbed_meta", "portfolio", "normal", "low");
}


function media_meta(){
  global $post;
  $custom = get_post_custom($post->ID);
  $media_meta = $custom["media_meta"][0];
  ?>
  <p><label>Media:</label><br />
  <textarea cols="110" rows="5" name="media_meta"><?php echo $media_meta; ?></textarea></p>
  <?php
}

function highlights_meta(){
  global $post;
  $custom = get_post_custom($post->ID);
  $highlights_meta = $custom["highlights_meta"][0];
  ?>
  <p><label>Highlights:</label><br />
  <textarea cols="110" rows="5" name="highlights_meta"><?php echo $highlights_meta; ?></textarea></p>
  <?php
}

function main_meta(){
  global $post;
  $custom = get_post_custom($post->ID);
  $main_meta = $custom["main_meta"][0];
  ?>
  <p><label>Main:</label><br />
  <textarea cols="110" rows="5" name="main_meta"><?php echo $main_meta; ?></textarea></p>
  <?php
}

function tabbed_meta(){
  global $post;
  $custom = get_post_custom($post->ID);
  $tabbed_meta = $custom["tabbed_meta"][0];
  ?>
  <p><label>Tabbed:</label><br />
  <textarea cols="110" rows="5" name="tabbed_meta"><?php echo $tabbed_meta; ?></textarea></p>
  <?php
}

add_action(\'save_post\', \'save_details\');

function save_details(){
  global $post;

  update_post_meta($post->ID, "media_meta", $_POST["media_meta"]);
  update_post_meta($post->ID, "highlights_meta", $_POST["highlights_meta"]);
  update_post_meta($post->ID, "main_meta", $_POST["main_meta"]);
  update_post_meta($post->ID, "tabbed_meta", $_POST["tabbed_meta"]);
}

add_action("manage_posts_custom_column",  "portfolio_custom_columns");
add_filter("manage_edit-portfolio_columns", "portfolio_edit_columns");

function portfolio_edit_columns($columns){
  $columns = array(
    "cb" => "<input type=\\"checkbox\\" />",
    "title" => "Portfolio Title",
    "description" => "Description",
    "media_meta" => "Media",
    "highlights_meta" => "Highlights",
    "main_meta" => "Main",
    "tabbed_meta" => "Tabbed",
    "portfolio_cat" => "Portfolio Categories"
  );

  return $columns;
}
function portfolio_custom_columns($column){
  global $post;

  switch ($column) {
    case "description":
      the_excerpt();
      break;
    case "media_meta":
      $custom = get_post_custom();
      echo $custom["media_meta"][0];
      break;
    case "highlights_meta":
      $custom = get_post_custom();
      echo $custom["highlights_meta"][0];
      break;
    case "main_meta":
      $custom = get_post_custom();
      echo $custom["main_meta"][0];
      break;
    case "tabbed_meta":
      $custom = get_post_custom();
      echo $custom["tabbed_meta"][0];
      break;
    case "portfolio_cat":
      echo get_the_term_list($post->ID, \'portfolio_cat\', \'\', \', \',\'\');
      break;
  }
}

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

在连接到的函数中save_posts 您应该确保检查该操作是否不是由自动保存例程触发的。我怀疑帖子“忘记”数据的原因是帖子自动保存,并用空白数据更新帖子元数据。

为此,请执行以下操作:

function save_details($post_id){
    //Make sure you check this isn\'t an autosave.
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
         return;

    update_post_meta($post_id, "media_meta", $_POST["media_meta"]);
    update_post_meta($post_id, "highlights_meta", $_POST["highlights_meta"]);
    update_post_meta($post_id, "main_meta", $_POST["main_meta"]);
    update_post_meta($post_id, "tabbed_meta", $_POST["tabbed_meta"]);
}
我快速浏览了一下教程。它似乎忽视了以下最佳做法和安全检查:

连接的函数save_posts 给出了论点$post_id(职位ID)。你应该使用这个而不是global $post.

  • Prefix your functions. save_details 是非常通用的,如果WordPress核心或其他插件使用该函数名,它将使您的博客崩溃。这对于插件开发人员尤为重要。在其前面加上独特的前缀:my_name_save_details. 其他函数也是如此current_user_can 验证是否允许用户编辑帖子
  • 使用nonce。在元数据库中,添加一个nonce并在中进行验证my_name_save_details. 这将检查您添加到数据库中的数据是否确实来自metabox。(See Codex)save_posts 每次保存/更新帖子或页面时激发,但您只想更改自定义帖子类型的帖子。这不是必要的,但可以消除进一步恶化的可能性。您可以使用get_post_type 来帮助解决这个问题

    SO网友:Gavin Anderegg

    答案来自Stephen Harris 很好,但表明滚动您自己的友好自定义字段可能是一种真正的痛苦。要安全有力地做事,你必须多拉WordPress的手。我将不再抱怨WordPress在默认情况下应该如何做这些事情。相反,我会告诉你the Advanced Custom Fields plugin 这将有助于解决上述问题。

    插件具有nice documentation for each of the different types of fields provided, 和handy code snippets for getting the data out and into your templates.

    最重要的是,它对你想要使用它的任何东西都是免费的。

    这个插件并不适用于每个网站,但当您只想在自定义帖子类型中添加几个额外字段时,它非常适合。

    如果您有兴趣继续滚动您自己的友好自定义字段,I highly recommend this article from .net magazine. 它解决了你正在经历的问题,并在过去帮助过我。

    结束

    相关推荐

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