我有一个博客,它严重依赖于用户生成的内容。
我希望我的用户能够创建帖子,但帖子必须只有特定字段:
if (isset($_POST[\'photo-title\']) && !empty($_FILES) ) {
// The user submitted the form.
// Create the post object.
$post = array(
// Forget the lack of validation for now ;)
\'post_title\' => $_POST[\'photo-title\'],
\'post_content\' => $_POST[\'photo-description\'],
\'post_status\' => \'publish\',
\'post_type\' => \'post\',
\'post_author\' => $user_ID,
\'post_category\' => array(5)
);
// Insert the post into the database.
$post_id = wp_insert_post( $post );
// If the post was successful
if ($post_id) {
// Add metadata for the photo
add_post_meta($post_id, \'ob_latitude\', $_POST[\'latitude\']);
add_post_meta($post_id, \'ob_longitude\', $_POST[\'longitude\']);
}
// Handle the photo upload.
$attach_id = media_handle_upload(\'photo\', $post_id );
}
最合适的回答,由SO网友:wyrfel 整理而成
如果让他们访问管理界面是一种选择,那么您就更安全、更省力了。
在这种情况下,您可以根据需要实现自定义帖子类型,在注册时禁用大多数“支持”标志,并添加自己的元框以支持纬度和经度。
使用一些额外的插件(如成员或任何其他能够编辑角色和功能的插件),您甚至可以将权限分配给这些应该能够编辑该帖子类型的用户。
所有这些都在法典中有很好的记录,而且相对容易做到。
如果您选择前端表单选项,那么您基本上只需要挖掘代码并尝试在前端重新实现它,这对您的学习体验来说并不是一件坏事,但这将花费您更长的时间。
Update: 在前端开发post表单。
首先,我仍然建议创建一个单独的自定义帖子类型。它允许您更轻松地将用户输入与其他内容分离,并允许您灵活地分配特定功能。
在何处查找内容我要做的是仔细查看以下文件,确保您了解发生的情况:
wp-admin/post.php
- 尤其是处理动作的部分wp-admin/includes/post.php
- 尤其edit_post()
和wp_write_post()
wp-admin/edit-form-advanced.php
- 很好地理解UI和它触发的动作之间的关系,因为您也想允许上传,所以还需要了解媒体方面的内容:wp-admin/includes/media.php
- 尤其media_handle_upload()
, media_upload_form_handler()
和media_upload_form()
wp-admin/includes/file.php
- 确保您理解wp_handle_upload()
wp-admin/includes/image.php
- 至少可以看看上传时附件会发生什么情况,当然,你必须包括这一点,如何进行,你最好的出发点是复制wp-admin/post.php
除去你所需要的一切来挽救这篇文章。尽可能多地消除不必要的依赖关系,但要保留保存帖子所涉及的函数调用。请记住,您使用的核心WP函数越多,级别越高,就越能在不同版本之间保持兼容,免费获得的健全性检查也就越多。
然后看看wp-admin/edit-form-advanced.php
它是一种依赖关系,目的是确定您的UI可能需要什么,以及如何在使用尽可能多的WP代码的同时提供这些。同时看看comment_form()
用于启发前端表单实现的功能。
这其中的一部分将是理解nonce机制(其实并不那么复杂)。
首先确保你的帖子内容有效。。。也就是说,您的用户可以创建并可能编辑/删除他们的帖子,并且您可以正确存储所有数据。
然后添加元数据UI并将其存储。进行此操作时,请尝试使用挂钩。例如,如果使用WP函数将帖子存储到db,则save_post
挂钩将运行。使用它来存储元数据。这是因为你做这类事情越多,就越容易适应WP的变化,甚至改变你做事的方式,你自己。使用挂钩可以隐式地模块化您的功能。
完成所有这些工作后,实现上载表单和上载处理脚本。我发现,媒体功能需要一点时间才能真正掌握。这是因为他们中的很多人都被AJAX驱动的管理端媒体Thickbox所困扰。然而,一旦你想出了如何将作物从垃圾中分离出来,你只需要打几个电话就可以运行媒体上传。
使用他在回答中提供的函数Bainternetthis question.
最后,确保为每个操作提供良好的用户反馈。当然,这在前端比在管理端更重要,所以请确保让用户知道发生了什么。再次尝试了解WP是如何处理这一问题的(它使用两种不同的机制将消息从一个页面传递到下一个页面)。
最后,形成示例,here\'s an example of a post and upload form 我写了一个照片比赛插件,希望很快能发布。虽然插件不使用常规附件,但它会为它们创建自己的类似附件的帖子类型,因此这比您的案例要复杂一些。它还使用了基于cookie的评论者识别机制,因为它最终对未登录的用户开放。所有这些你可能都不需要,但是,无论如何,寻找灵感可能是件好事(除非你想重复使用media_upload_form()
, 可能)。