如何在WordPress前端为自定义文章类型添加作者删除按钮?
自定义文章类型(events)用户资料页添加作者删除按钮方案
你当前的代码存在几个关键问题导致删除按钮无法正常工作,包括权限判断错误、缺少表单提交处理逻辑、安全验证缺失,以下是修复后的完整方案:
一、核心问题分析
- 原代码仅显示给管理员,未验证当前登录用户是否是文章作者
- 没有处理表单提交的删除逻辑,点击按钮无实际操作
- 缺少WordPress安全验证(nonce),存在CSRF风险
- 表单
action为空,可能导致提交后页面跳转异常
二、完整修复代码
// 处理删除文章的表单提交逻辑 function handle_event_delete() { // 验证nonce和权限 if (isset($_POST['event_delete_nonce']) && wp_verify_nonce($_POST['event_delete_nonce'], 'event_delete_action')) { $post_id = intval($_POST['pid']); $post = get_post($post_id); // 验证当前用户是否是文章作者或拥有删除权限 if (current_user_can('delete_post', $post_id) || (get_current_user_id() == $post->post_author)) { wp_delete_post($post_id, true); // true=永久删除,false=移至回收站 // 跳转回当前页面,避免重复提交 wp_safe_redirect($_SERVER['HTTP_REFERER']); exit; } } } add_action('init', 'handle_event_delete'); // 输出删除按钮(仅显示给有权限的用户) function show_publish_button($post_id) { $post = get_post($post_id); // 验证当前用户是否有权限删除该文章 if (current_user_can('delete_post', $post_id) || (get_current_user_id() == $post->post_author)) { $nonce = wp_create_nonce('event_delete_action'); echo '<form id="event-delete-form-' . $post_id . '" name="front_end_delete" method="POST" action="' . esc_url($_SERVER['REQUEST_URI']) . '"> <input type="hidden" name="pid" id="pid" value="' . $post_id . '"> <input type="hidden" name="event_delete_nonce" value="' . $nonce . '"> <button type="submit" name="submit" value="delete" class="btn" style="margin-left:2px;background:#f5f5f5;"> <i class="fa fa-fw fa-times"></i>删除 </button> </form>'; } } // 用户资料页的管理事件标签内容 function manage_events_content() { $type = 'events'; $paged = get_query_var('paged') ? get_query_var('paged') : 1; $args = array ( 'post_type' => $type, 'author' => bp_displayed_user_id(), 'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => 10, 'ignore_sticky_posts' => 1, ); $wp_query = new WP_Query($args); if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : $wp_query->the_post(); echo '<div style="background-color:#fff; padding: 20px; border-radius: 10px; margin: 20px"> <div> <div> <h4 style="font-weight: 400; font-size: 15px; text-transform: capitalize">活动名称: <a style="color:#5a5a5a;" href="' . get_the_permalink() . '">' . get_the_title() . '</a> </h4> </div> <div> <h4> 可用票数: <span>' . get_post_meta(get_the_ID(), "number-of-ticket-available", true) . '</span> </h4> <h4> 已确认参与人数: <span>' . get_post_meta(get_the_ID(), "number-of-confirmed-attendees", true) . '</span> </h4> </div> <div> <h4> 开始日期: <span>' . get_post_meta(get_the_ID(), "event-anfang", true) . '</span> </h4> <h4> 结束日期: <span>' . get_post_meta(get_the_ID(), "event-ende", true) . '</span> </h4> </div>'; // 传递当前文章ID给按钮函数,避免全局变量依赖 show_publish_button(get_the_ID()); echo ' </div> </div>'; endwhile; // 添加分页导航 echo '<div class="pagination">'; echo paginate_links(array( 'total' => $wp_query->max_num_pages, 'current' => $paged, 'prev_text' => __('上一页'), 'next_text' => __('下一页'), )); echo '</div>'; else : echo '<h4>你还没有创建任何活动</h4>'; endif; wp_reset_postdata(); // 重置查询状态,避免影响全局变量 }
三、关键修改说明
- 权限控制:仅让文章作者或拥有删除权限的用户看到删除按钮
- 安全防护:添加nonce验证,防止跨站请求伪造攻击
- 提交处理:新增函数处理删除请求,调用WordPress原生
wp_delete_post完成删除操作 - 变量优化:通过参数传递文章ID,避免依赖全局
$post变量的潜在问题 - 查询规范:使用
wp_reset_postdata()重置查询,符合WordPress开发标准 - 体验提升:添加分页导航,支持多页活动展示
内容的提问来源于stack exchange,提问作者Ilham Mohomed
相关产品推荐
相关产品推荐

