许多 WordPress 网站都提供了用户投稿功能,这个功能非常实用,不仅适用于文章投稿,也适用于友情链接提交、网址提交等需要表单提交的场景。
例如,本站的网址导航页面就包含一个网址提交表单,本质上也是一种投稿功能,只是投稿对象是网址而非文章。
实现文章投稿功能其实并不复杂。下面分享一套经过实践的自定义投稿功能代码实现方案。
实现步骤
第一步:创建模板文件
在当前主题目录下,创建一个新的 PHP 文件,命名为 submit.php。
第二步:添加核心功能代码
将以下代码复制到 submit.php 文件中。这段代码定义了模板名称,并处理了表单提交逻辑,包括数据验证和将数据保存为文章。
<?php
/* Template Name: 网址提交 */
get_header();
$bloginfo = get_bloginfo('url');
if( isset($_POST['tougao_form']) && $_POST['tougao_form'] == 'send') {
global $wpdb;
$current_url = $bloginfo.'/site'; // 注意:请将此处的链接地址修改为你实际的页面地址
$last_post = $wpdb->get_var("SELECT `post_date` FROM `$wpdb->posts` ORDER BY `post_date` DESC LIMIT 1");
// 初始化表单变量并转义
$title = isset( $_POST['tougao_title'] ) ? trim(htmlspecialchars($_POST['tougao_title'], ENT_QUOTES)) : '';
$url = isset( $_POST['tougao_url'] ) ? esc_url_raw($_POST['tougao_url']) : ''; // 修正:使用 esc_url_raw 处理 URL
$description = isset( $_POST['tougao_description'] ) ? trim(htmlspecialchars($_POST['tougao_description'], ENT_QUOTES)) : '';
$icon = isset( $_POST['tougao_icon'] ) ? esc_url_raw($_POST['tougao_icon']) : ''; // 修正:使用 esc_url_raw 处理图标 URL
// 验证:网站标题
if ( empty($title) || mb_strlen($title) < 1 ) {
echo '<script>alert("网站标题不能为空!");</script>';
echo '<meta http-equiv="refresh" content="0;url=' . $bloginfo . '">';
die();
}
// 验证:网站地址
if ( empty($url) || mb_strlen($url) < 1 ) {
echo '<script>alert("网站地址不能为空!");</script>';
echo '<meta http-equiv="refresh" content="0;url=' . $bloginfo . '">';
die();
}
// 验证:网站描述
if ( empty($description) || mb_strlen($description) < 5 ) {
echo '<script>alert("网站描述不能为空,且不得少于5个字!");</script>';
echo '<meta http-equiv="refresh" content="0;url=' . $bloginfo . '">';
die();
}
// 验证:网站图标
if ( empty($icon) || mb_strlen($icon) < 1 ) {
echo '<script>alert("网站icon图标不能为空!");</script>';
echo '<meta http-equiv="refresh" content="0;url=' . $bloginfo . '">';
die();
}
// 组合文章内容
$post_content = '网站标题: '.$title.'<br />网站地址: '.$url.'<br />网站描述: '.$description.'<br />网站icon图标:'.$icon;
$tougao = array(
'post_title' => $title,
'post_content' => $post_content,
'post_status' => 'pending', // 修正:建议初始状态设为“待审”,而非直接发布
// 'post_type' => 'site' // 如需保存到自定义文章类型,请取消注释并修改 'site' 为你的类型名称
);
// 将文章插入数据库
$status = wp_insert_post( $tougao );
if ($status != 0) {
echo '<script>alert("提交成功,请等待审核!");</script>';
echo '<meta http-equiv="refresh" content="0;url=' . $bloginfo . '">';
} else {
echo '<script>alert("提交失败,请重新填写!");</script>';
echo '<meta http-equiv="refresh" content="0;url=' . $bloginfo . '">';
}
}
?>
第三步:添加前端表单
在上述功能代码之后,添加以下 HTML 表单代码,用于在前端显示投稿表单。
<form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
<input type="text" id="tougao_title" value="" name="tougao_title" placeholder="网站标题" required />
<input type="url" id="tougao_url" value="" name="tougao_url" placeholder="网站地址 (包含 http:// 或 https://)" required />
<input type="text" id="tougao_category" value="" name="tougao_category" placeholder="网站类别" />
<textarea id="tougao_description" name="tougao_description" placeholder="网站描述 (不少于5个字)" rows="4" required></textarea>
<input type="url" id="tougao_icon" value="" name="tougao_icon" placeholder="网站icon图标地址" required />
<div class="t">
<input type="hidden" value="send" name="tougao_form" />
<button class="button" type="submit" value="提交" >提交申请</button>
<button class="button" type="reset" value="重填" >清空</button>
</div>
</form>
说明与修正:
- 修正了表单中重复的
tougao_url字段名,新增了tougao_category字段。 - 将“网站描述”从
<input>改为<textarea>以容纳更多文本。 - 为关键字段添加了
required属性,进行前端基础验证。 - 将
action属性中的$_SERVER["REQUEST_URI"]用esc_url()函数进行了转义,提升安全性。
第四步:添加页面内容容器
在表单代码之后,添加以下代码以输出页面原有的内容(如果存在)。
<div>
<?php while(have_posts()) : the_post(); ?>
<?php the_content(); ?>
<?php endwhile; ?>
</div>
第五步:引入页脚
在文件末尾,引入 WordPress 主题的页脚。
<?php get_footer(); ?>
第六步:创建投稿页面
在 WordPress 后台,新建一个页面。在“页面属性”的“模板”下拉框中,选择刚才创建的“网址提交”模板,然后发布页面即可。
功能扩展与安全建议
- 自定义文章类型:如需将投稿保存到特定的自定义文章类型(如“网址导航”),请取消功能代码中
'post_type' => 'site'的注释,并将site替换为你的自定义文章类型名称。 - 状态管理:代码已将新文章状态默认设为
pending(待审),管理员可以在后台审核后再发布,这比直接publish(发布)更安全可控。 - 安全增强:生产环境中,建议添加 Nonce 验证(
wp_nonce_field)以防止跨站请求伪造(CSRF),并对提交频率进行限制。 - 邮件通知:可以集成
wp_mail()函数,在新投稿提交时给管理员发送邮件通知。
结语
通过以上步骤,一个基础的 WordPress 投稿功能就搭建完成了。你可以根据自己的需求调整表单字段和文章保存逻辑。这套方案代码清晰,修改灵活,是学习 WordPress 主题开发中处理表单与数据的一个不错实践。
谢谢支持
Release Me