如何将变量从my_action传递到ACF的get_players筛选函数?
问题原因
my_action是处理AJAX请求的独立HTTP请求,请求完成后所有变量(包括全局变量)都会被销毁。而get_players是在另一个请求(比如页面加载、后台编辑页面加载)中触发的ACF钩子,两个请求完全独立,所以全局变量根本无法传递数据。
方案1:用WordPress临时选项存储值
通过WP选项存储临时数据,在ACF钩子中读取,用完可清理避免残留:
修改my_action函数
function my_action() { $selezionato = isset($_POST['selezionato']) ? $_POST['selezionato'] : ''; // 存储值到临时选项 update_option('temp_selezionato_club', $selezionato, false); // 设置1小时过期时间,自动清理 set_transient('temp_selezionato_club_expire', '1', 3600); echo $selezionato; wp_die(); }
修改get_players函数
function get_players($field) { // 读取临时选项值 $selezionato = get_option('temp_selezionato_club', ''); // 检查是否过期,过期则清空数据 if (!get_transient('temp_selezionato_club_expire')) { delete_option('temp_selezionato_club'); $selezionato = ''; } $field['choices'] = array(); if (!empty($selezionato)) { $args = array( 'numberposts' => -1, 'post_type' => 'players', 'meta_key' => 'club', 'meta_value' => $selezionato ); $the_query = new WP_Query($args); if ($the_query->have_posts()) { while ($the_query->have_posts()) { $the_query->the_post(); $value = get_field('numero'); $label = get_the_title(); $field['choices'][$value] = $label; } wp_reset_postdata(); } } return $field; }
方案2:前端AJAX动态更新ACF选项
直接通过AJAX请求获取球员数据,用JS修改ACF字段的选项(适合后台编辑页面场景):
修改my_action返回球员数据
function my_action() { $selezionato = isset($_POST['selezionato']) ? $_POST['selezionato'] : ''; $players = array(); if (!empty($selezionato)) { $args = array( 'numberposts' => -1, 'post_type' => 'players', 'meta_key' => 'club', 'meta_value' => $selezionato ); $the_query = new WP_Query($args); if ($the_query->have_posts()) { while ($the_query->have_posts()) { $the_query->the_post(); $value = get_field('numero'); $label = get_the_title(); $players[$value] = $label; } wp_reset_postdata(); } } wp_send_json_success($players); }
注册前端脚本(主题functions.php中添加)
function enqueue_custom_acf_script() { if (is_admin()) { wp_enqueue_script('custom-acf-script', get_template_directory_uri() . '/js/custom-acf.js', array('jquery'), '1.0', true); // 传递AJAX必要参数 wp_localize_script('custom-acf-script', 'customAjax', array( 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('custom_acf_nonce') )); } } add_action('admin_enqueue_scripts', 'enqueue_custom_acf_script');
编写JS逻辑(主题/js/custom-acf.js)
jQuery(document).ready(function($) { // 替换成触发选择的实际元素ID $('#selezionato').change(function() { var selectedValue = $(this).val(); $.ajax({ url: customAjax.ajaxurl, type: 'POST', data: { action: 'my_action', selezionato: selectedValue, nonce: customAjax.nonce }, success: function(response) { if (response.success) { var players = response.data; // 替换成ACF字段的实际name属性值 var $select = $('[name="acf[field_xxxxxx]"]'); $select.empty(); // 动态添加选项 $.each(players, function(value, label) { $select.append($('<option>', { value: value, text: label })); }); } } }); }); });
方案3:存储到用户元数据(仅登录用户有效)
如果操作对象是登录用户,可将值存在用户元数据中:
修改my_action函数
function my_action() { if (is_user_logged_in()) { $selezionato = isset($_POST['selezionato']) ? $_POST['selezionato'] : ''; update_user_meta(get_current_user_id(), 'temp_selezionato_club', $selezionato); echo $selezionato; } wp_die(); }
修改get_players函数
function get_players($field) { $selezionato = ''; if (is_user_logged_in()) { $selezionato = get_user_meta(get_current_user_id(), 'temp_selezionato_club', true); } $field['choices'] = array(); if (!empty($selezionato)) { $args = array( 'numberposts' => -1, 'post_type' => 'players', 'meta_key' => 'club', 'meta_value' => $selezionato ); $the_query = new WP_Query($args); if ($the_query->have_posts()) { while ($the_query->have_posts()) { $the_query->the_post(); $value = get_field('numero'); $label = get_the_title(); $field['choices'][$value] = $label; } wp_reset_postdata(); } } return $field; }
内容的提问来源于stack exchange,提问作者user23036647
相关产品推荐
相关产品推荐

