如何从前端调用WordPress functions.php中定义的update_page函数
如何从前端触发WordPress中的update_page函数
首先得先指出你原update_page函数里的几个小问题,不然即使触发了也会报错:
- 函数参数是
$post_id,但你里面用了$post->ID,应该统一用$post_id $status变量没有定义,你得先给它赋值或者明确它的来源
先给你修正后的函数示例:
function update_page($post_id){ // 避免自动保存时重复触发 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; // 检查用户是否有编辑权限 if (!current_user_can('edit_post', $post_id)) return; $posttypename = get_post_type($post_id); $rank = get_field('rank', $post_id); // 这里给个示例逻辑,你可以根据实际需求调整status的取值 $status = $rank >= 10 ? 'priority' : 'regular'; update_field('status', $status, $post_id); } add_action('save_post', 'update_page');
接下来,要从前端触发这个函数,你得通过WordPress AJAX来实现——毕竟前端没法直接调用PHP函数,必须通过HTTP请求和后端交互。具体步骤如下:
1. 在functions.php中注册AJAX处理逻辑
添加以下代码,用来接收并处理前端的AJAX请求:
// 注册登录用户可用的AJAX动作 add_action('wp_ajax_trigger_update_page', 'trigger_update_page_handler'); // 注册未登录用户可用的AJAX动作(如果不需要开放给未登录用户可以删掉) add_action('wp_ajax_nopriv_trigger_update_page', 'trigger_update_page_handler'); function trigger_update_page_handler() { // 验证请求合法性,防止恶意调用 check_ajax_referer('update_page_nonce', 'nonce'); // 获取前端传递的文章ID $post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0; // 检查文章是否存在,以及用户是否有权限编辑 if (!$post_id || !get_post($post_id) || !current_user_can('edit_post', $post_id)) { wp_send_json_error('无效的文章ID或无操作权限'); wp_die(); } // 调用你的update_page函数完成更新 update_page($post_id); wp_send_json_success('状态字段更新完成'); wp_die(); // 必须终止AJAX请求 }
2. 前端JS代码触发AJAX请求
在你的page_ranks.php或者前端脚本中,添加以下代码(这里用原生JS示例,你也可以用jQuery):
// 封装触发更新的函数 function triggerUpdatePage(postId) { const formData = new FormData(); formData.append('action', 'trigger_update_page'); // 和后端注册的AJAX动作名对应 formData.append('post_id', postId); // 获取页面中生成的验证nonce formData.append('nonce', document.getElementById('update_page_nonce').value); fetch(ajaxurl, { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.success) { console.log(data.data); // 输出"状态字段更新完成" // 这里可以添加更新成功后的页面交互逻辑 } else { console.error('更新失败:', data.data); } }) .catch(error => console.error('请求出错:', error)); } // 在你更新rank字段之后调用这个函数 // 示例:假设你已经完成rank更新,postId是目标文章ID // update_field('rank', newRankValue, postId); // 你的原有rank更新代码 // triggerUpdatePage(postId); // 触发status字段更新
3. 在页面中输出验证用的nonce
为了安全,必须在前端页面中输出WordPress生成的验证nonce,同时暴露AJAX请求地址。可以在你的模板文件或者page_ranks.php中添加:
<?php // 输出隐藏的nonce字段 wp_nonce_field('update_page_nonce', 'update_page_nonce'); // 把WordPress的AJAX地址注入为全局变量,供前端使用 wp_localize_script('jquery', 'ajaxurl', admin_url('admin-ajax.php')); ?>
这样一来,当你在前端更新完rank字段后,调用triggerUpdatePage(postId)就能触发后端的update_page函数,自动完成status字段的更新了。
内容的提问来源于stack exchange,提问作者user5016229
相关产品推荐
相关产品推荐

