方法一: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目录可写。投稿将进入待审状态,管理员可在后台审核。