纯代码实现WordPress订阅者发布功能的完整代码方案

方法一:WordPress订阅者投稿功能

以下是实现WordPress订阅者发布功能的完整代码方案,包含前端表单和后端处理:

把下面这段代码需要添加到当前主题的functions.php文件中。


// 允许订阅者角色发布文章
function allow_subscriber_posts() {
    $subscriber = get_role('subscriber');
    $subscriber->add_cap('publish_posts');
}
add_action('init', 'allow_subscriber_posts');

// 创建前端投稿表单短代码
function subscriber_post_form() {
    ob_start();
    if(is_user_logged_in() && current_user_can('subscriber')) {
        if(isset($_POST['submit_post'])) {
            $post_title = sanitize_text_field($_POST['post_title']);
            $post_content = wp_kses_post($_POST['post_content']);
            
            $new_post = array(
                'post_title' => $post_title,
                'post_content' => $post_content,
                'post_status' => 'pending',
                'post_type' => 'post'
            );
            
            $post_id = wp_insert_post($new_post);
            
            if($post_id) {
                echo '<div class="success">投稿成功,等待审核!</div>';
            }
        }
        
        echo '<form method="post" class="submission-form">
            <h3>发布新内容</h3>
            <p><label>标题:</label><br>
            <input type="text" name="post_title" required></p>
            
            <p><label>内容:</label><br>
            <textarea name="post_content" rows="10" required></textarea></p>
            
            <p><input type="submit" name="submit_post" value="提交"></p>
        </form>';
    } else {
        echo '<p>请先登录订阅者账号</p>';
    }
    return ob_get_clean();
}
add_shortcode('submission_form', 'subscriber_post_form');

把下面这段代码需要添加到当前主题的style.css文件中。

.submission-form {
    max-width: 600px;
    margin: 20px auto;
    padding: 20px;
    background: #f9f9f9;
    border: 1px solid #ddd;
}

.submission-form label {
    font-weight: bold;
    display: block;
    margin-bottom: 5px;
}

.submission-form input[type="text"],
.submission-form textarea {
    width: 100%;
    padding: 8px;
    margin-bottom: 15px;
    border: 1px solid #ddd;
}

.submission-form input[type="submit"] {
    background: #0073aa;
    color: white;
    padding: 10px 15px;
    border: none;
    cursor: pointer;
}

.success {
    color: green;
    margin-bottom: 15px;
}

使用方法:

1. 将functions.php代码添加到当前主题的functions.php文件底部

2. 将CSS代码添加到主题的style.css文件

3. 在任意页面使用[submission_form]短代码显示投稿表单。订阅者提交的内容将进入待审状态。

方法二:增强版的WordPress订阅者投稿功能,包含分类、标签、特色图片和媒体上传功能:

以下是增强版的WordPress订阅者投稿功能,包含分类、标签、特色图片和媒体上传功能:

把下面这段代码需要添加到当前主题的functions.php文件中。


// 允许订阅者上传媒体
function allow_subscriber_uploads() {
    $subscriber = get_role('subscriber');
    $subscriber->add_cap('upload_files');
    $subscriber->add_cap('publish_posts');
}
add_action('init', 'allow_subscriber_uploads');

// 前端投稿表单短代码
function enhanced_submission_form() {
    ob_start();
    if(is_user_logged_in() && current_user_can('subscriber')) {
        if(isset($_POST['submit_post'])) {
            // 处理表单提交
            $post_title = sanitize_text_field($_POST['post_title']);
            $post_content = wp_kses_post($_POST['post_content']);
            $post_category = isset($_POST['post_category']) ? array_map('intval', $_POST['post_category']) : array();
            $post_tags = isset($_POST['post_tags']) ? sanitize_text_field($_POST['post_tags']) : '';
            
            $new_post = array(
                'post_title' => $post_title,
                'post_content' => $post_content,
                'post_status' => 'pending',
                'post_type' => 'post',
                'post_category' => $post_category,
                'tags_input' => $post_tags
            );
            
            $post_id = wp_insert_post($new_post);
            
            // 处理特色图片
            if($post_id && !empty($_FILES['featured_image']['name'])) {
                require_once(ABSPATH . 'wp-admin/includes/image.php');
                require_once(ABSPATH . 'wp-admin/includes/file.php');
                require_once(ABSPATH . 'wp-admin/includes/media.php');
                
                $attachment_id = media_handle_upload('featured_image', $post_id);
                if(!is_wp_error($attachment_id)) {
                    set_post_thumbnail($post_id, $attachment_id);
                }
            }
            
            if($post_id) {
                echo '<div class="success">投稿成功,等待审核!</div>';
            }
        }
        
        // 获取可选择的分类
        $categories = get_categories(array('hide_empty' => false));
        
        echo '<form method="post" class="submission-form" enctype="multipart/form-data">
            <h3>发布新内容</h3>
            <p><label>标题:</label><br>
            <input type="text" name="post_title" required></p>
            
            <p><label>内容:</label><br>
            <textarea name="post_content" rows="10" required></textarea></p>
            
            <p><label>分类:</label><br>';
            foreach($categories as $category) {
                echo '<label><input type="checkbox" name="post_category[]" value="'.$category->term_id.'"> '.$category->name.'</label><br>';
            }
            echo '</p>
            
            <p><label>标签(用逗号分隔):</label><br>
            <input type="text" name="post_tags"></p>
            
            <p><label>特色图片:</label><br>
            <input type="file" name="featured_image" accept="image/*"></p>
            
            <p><label>其他媒体文件:</label><br>
            <input type="file" name="post_media[]" multiple></p>
            
            <p><input type="submit" name="submit_post" value="提交"></p>
        </form>';
    } else {
        echo '<p>请先登录订阅者账号</p>';
    }
    return ob_get_clean();
}
add_shortcode('enhanced_submission_form', 'enhanced_submission_form');

// 处理多文件上传
function handle_post_media($post_id) {
    if(!empty($_FILES['post_media'])) {
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        require_once(ABSPATH . 'wp-admin/includes/file.php');
        require_once(ABSPATH . 'wp-admin/includes/media.php');
        
        foreach($_FILES['post_media']['name'] as $key => $value) {
            if($_FILES['post_media']['name'][$key]) {
                $file = array(
                    'name' => $_FILES['post_media']['name'][$key],
                    'type' => $_FILES['post_media']['type'][$key],
                    'tmp_name' => $_FILES['post_media']['tmp_name'][$key],
                    'error' => $_FILES['post_media']['error'][$key],
                    'size' => $_FILES['post_media']['size'][$key]
                );
                
                $attachment_id = media_handle_upload($file, $post_id);
            }
        }
    }
}
add_action('save_post', 'handle_post_media');

把下面这段代码需要添加到当前主题的style.css文件中。

mission-form {
    max-width: 800px;
    margin: 20px auto;
    padding: 30px;
    background: #f9f9f9;
    border: 1px solid #ddd;
    border-radius: 5px;
}

.submission-form label {
    font-weight: bold;
    display: block;
    margin: 15px 0 5px;
}

.submission-form input[type="text"],
.submission-form textarea,
.submission-form input[type="file"] {
    width: 100%;
    padding: 10px;
    margin-bottom: 15px;
    border: 1px solid #ddd;
    border-radius: 4px;
}

.submission-form textarea {
    min-height: 200px;
}

.submission-form input[type="submit"] {
    background: #0073aa;
    color: white;
    padding: 12px 20px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    font-size: 16px;
}

.submission-form input[type="submit"]:hover {
    background: #005d8c;
}

.success {
    color: #28a745;
    margin: 20px 0;
    padding: 10px;
    background: #e8f5e9;
    border: 1px solid #c3e6cb;
    border-radius: 4px;
}

使用说明:

1. 将functions.php代码添加到主题文件

2. 添加CSS样式

3. 在页面使用[enhanced_submission_form]短代码

4. 确保wp-content/uploads目录可写。投稿将进入待审状态,管理员可在后台审核。