You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:45:30