博客 / WordPress/ WordPress纯代码添加文章投稿功能

WordPress纯代码添加文章投稿功能

WordPress纯代码添加文章投稿功能

许多 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 主题开发中处理表单与数据的一个不错实践。

2 条评论

  1. 谢谢支持

发表评论

您的邮箱不会公开。必填项已用 * 标注。