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

如何将变量从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:54:54