WordPress CMS - 可以制作“动态”自定义帖子类型吗?

时间:2011-04-29 03:38:53

标签: php wordpress custom-post-type

我有一个wordpress项目,主要用作CMS。感谢这个精彩的社区,我已经从对WordPress一无所知,能够创建自定义帖子类型(对于我的产品列表),使用分层分类法对它们进行分类,并为此产品帖子类型创建自定义字段。

现在,我的产品非常简单。他们有ProductNameProductTypeProductCategoryDocumentNameDocumentURL。最后两个是相关的,因为DocumentURL是指向网络上PDF的链接,而DocumentName是DocumentURL的标签。我为DocumentNameDocumentURL创建了自定义字段,并可以为每个Product自定义帖子添加1个字段。但是,我的Product可能有多个文档URL和文档名称,或者它可能有1个,甚至是0.有没有办法让它变得动态,所以我有多少没关系?或者我是否需要提供最大数量并为产品自定义帖子创建许多自定义字段?

如果这只是直接的PHP或ASP.NET我只是为Document元素创建一个单独的db表,并将一个漂亮的表单与一些以2或3个文档字段开头的jQuery放在一起,如果他们需要更多,他们可以单击+符号以添加另一行文档字段(如此http://deepliquid.com/projects/appendo/demos.php)。然后遍历它们并将它们添加到数据库中。使用WordPress会有类似的事情吗?

我唯一的另一个想法是为文档创建一个新的自定义帖子类型并创建与他们的产品的关系,但我无法理解它是如何工作的。

任何建议将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:4)

考虑到你在这里说的话,我会假设你对PHP感到满意。好消息是你的PHP知识会在这里派上用场。是时候学习register_post_type函数的新功能了;也就是register_meta_box_cb参数。这允许您定义一个函数来调用以在cpt添加和编辑页面上添加元数据。例如,这里有一个cpt(直接来自于codex),附带参数:

add_action('init', 'codex_custom_init');
function codex_custom_init() 
{
  $labels = array(
    'name' => _x('Books', 'post type general name'),
    'singular_name' => _x('Book', 'post type singular name'),
    'add_new' => _x('Add New', 'book'),
    'add_new_item' => __('Add New Book'),
    'edit_item' => __('Edit Book'),
    'new_item' => __('New Book'),
    'view_item' => __('View Book'),
    'search_items' => __('Search Books'),
    'not_found' =>  __('No books found'),
    'not_found_in_trash' => __('No books found in Trash'), 
    'parent_item_colon' => '',
    'menu_name' => 'Books'

  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'has_archive' => true, 
    'hierarchical' => false,
    'menu_position' => null,
    'register_meta_box_cb' => 'my_meta_box_function',
    'supports' => array('title','editor','author','thumbnail','excerpt','comments')
  ); 
  register_post_type('book',$args);
}}

现在您已经定义了元框cb函数,请使用它:

function my_beta_box_function(){
    add_meta_box(
        'myplugin_sectionid',
        __( 'My Post Section Title', 'myplugin_textdomain' ), 
        'myplugin_inner_custom_box',
        'book'
    );
}

add_meta_box为您定义了一个元框,并提供了一个在元数据库中创建内容的函数。在这种情况下,我们的代码指的是函数myplugin_inner_custom_box。有关添加元框的更多信息,请查看http://codex.wordpress.org/Function_Reference/add_meta_box。因此,我们现在需要通过定义函数来添加我们的内容:

function myplugin_inner_custom_box()
{
   // Everything here would appear in the meta box
}

此时,您可以利用PHP知识创建可以在提交后处理的HTML表单。您可以像添加任何其他PHP应用程序一样添加+按钮并使用PHP。我不打算怎么做,因为我认为你可以做到这一点。我实际上创建了一些像这样的元变量,在了解了我发布的函数之后,我可以依靠我的PHP知识。最后一部分是保存输入。通过使用定义保存例程和save_post操作的函数,您可以使用PHP知识来保存数据:

/* Do something with the data entered */
add_action('save_post', 'myplugin_save_postdata');

/* When the post is saved, saves our custom data */
function myplugin_save_postdata( $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;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) ) )
      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

  $mydata = $_POST['myplugin_new_field'];

  update_post_meta('my_field', $mydata);

   return $mydata;
}

最后,关于保存功能的说明。如果使用数组值命名输入字段(例如docs[]),$ _POST ['docs']值将是一个数组。幸运的是,WP的update_post_meta函数都设置为处理数组输入。它将序列化并输入它。使用兼容的get_post_meta函数将反序列化数组以便使用数据输出。

祝你好运!