使用PHP和AJAX更改基于先前SELECT的选择选项

时间:2017-10-23 作者:Marcelo Henriques Cortez

我看了一些答案,然后在谷歌上搜索了一下。。。但没能做到这一点。我没有Ajax方面的经验,而且我对PHP还是新手。

我需要的是根据第一个选项的值更改其他选项的选项。我需要在不重新加载页面的情况下执行此操作。

为什么不使用jQuery?因为我以后必须从select中获取值才能注册广告,然后我会得到额外的select字段,这有点搞砸了。

I\'m not getting any error and it doesn\'t work:

Ok, I tweaked the code and here is what I have so far:

在我的标题中。php\'

<script>
jQuery(function($) {
    $("#opt-categorias").change(function(){
        var opt_categorias = $("#opt-categorias").val();
        $.ajax({
            type: "GET",
            url: \'gerenciamento-categorias.php?cat=\'+opt_categorias,
            contentType:"application/json; charset=utf-8",
            dataType: "json",
            success: function(data){
                $("#opt_tipo").empty();
                $("#opt_tipo").append("<option value=\'\'> Tipo de produto</option>");
                $.each(data, function(i, item){
                        $("#opt_tipo").append(\'<option value="\'+ data[i].slug +\'">\'+ data[i].name +\'</option>\');

                });
            },
            complete:function(){

            }
        }); 
    });
});
</script>
在我的尸体上。php\'

$categorias = \'categorias\';
$tax_categorias = get_terms($categorias, array(\'hide_empty\' => false));
<div class="detalhes-artigo">
<div class="col-md-2 categorias" id="lista-categorias">
    <select id ="opt-categorias" name="opt-categorias" class="opt-categorias">
    <option value="#"> Categoria </option>
    <?php
    foreach ($tax_categorias as $tax_categoria) {
    // Check if current term ID is equal to term ID stored in database
    $selected_categorias = ( $stored_cat_categoria ==  $tax_categoria->term_id  ) ? \'selected\' : \'\';
    echo \'<option value=\'. $tax_categoria->slug.\'\' . $selected . \'>\' . $tax_categoria->name. \'</option>\';
    }
    ?>
    </select>
</div>
<div class="col-md-2 tipos" id="lista-tipos">
    <div class="col-md-2 opt_tipo">
        <select id="opt_tipo" name="opt_tipo" class="opt_tipo">
        </select>
    </div>
</div>

在我的gerenciamento分类中。php’(我有更多的选项,但只保留其中的一部分,因为它们都具有相同的结构)

$tipos_bicicletas = \'tipos_bicicletas\';
$tax_tipos_bicicletas = get_terms($tipos_bicicletas, array(\'hide_empty\' =>     false));

if ( $_GET[\'cat\'] == \'bicicleta\' ) {

json_encode($tax_tipos_bicicletas);

}

1 个回复
最合适的回答,由SO网友:Tom 整理而成

您需要采取的第一步是稍微重新组织代码。WordPress允许您通过一个动作wp\\u Ajax注册Ajax调用。这是一种更安全、更简单的方法来创建可以与javascript一起使用的ajax调用。

下面我已经创建了您需要的所有内容。前两个函数将放在主题函数中。php和最后一块将需要放置在自定义文件中。主题根目录中的js文件。

第一个函数调用custom。js并将其排队以加载到主题中。这是WordPress通过加载链向上发送脚本以加载到wp\\u head或wp\\u footer中的方式,具体取决于您的喜好。我们还使用wp\\u localize\\u脚本在javascript中设置一些变量,以便使用ajax。这些存储在clocal中,看起来像这样:clocal。ajaxurl和clocal。暂时的。“nonce”是我们用来再次检查坏人是否试图通过此ajax调用攻击您的站点的安全密钥。

/*
 * File: functions.php
 * This function will enqueue (insert) the script into the WordPress header or footer the proper way, instead of adding it directly to the header.php
 * We use wp_localize_script to inject a javascript object, clocal, into our custom.js to gain access to the variables ajaxurl and nonce.
 *
 * Source:
 * https://developer.wordpress.org/reference/functions/wp_enqueue_script/
 * https://codex.wordpress.org/Function_Reference/wp_localize_script
 * https://codex.wordpress.org/Function_Reference/wp_create_nonce
 */

add_action( \'wp_enqueue_scripts\', \'cortez_enqueue_script\' );
function cortez_enqueue_script() {
    wp_enqueue_script( \'cortez_custom_js\', get_stylesheet_directory_uri() . \'/custom.js\', array( \'jQuery\' ), \'1.0\', true );
    wp_localize_script( \'cortez_custom_js\', \'clocal\', array(
        \'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
        \'nonce\'   => wp_create_nonce( \'cortez_nonce_security_key\' ),
    ) );
}
下一个函数是ajax调用。我们使用两个动作,wp_ajaxwp_ajax_nopriv 启用ajax操作“cortez\\u get\\u terms”。请注意,该操作正好位于WordPress操作的内部:wp_ajax_cortez_get_terms. 有了这个定义,我们可以在javascript端请求操作“cortez\\u get\\u terms”。

在这个函数的开头,您会注意到wp_verify_nonce. 这是检查我们在前面的函数中创建的安全密钥,以确保它是有效的请求。

/*
 * File: functions.php
 * Add this to your functions.php to enable the ajax call to be called from custom.js. The two actions are required if you want logged in and non-logged in users to be able to use the ajax function.
 *
 * Source:
 * https://codex.wordpress.org/AJAX_in_Plugins
 * https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)
 * https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_nopriv_(action)
 * https://codex.wordpress.org/Function_Reference/wp_verify_nonce
 */
add_action( \'wp_ajax_cortez_get_terms\', \'cortez_get_terms\' );
add_action( \'wp_ajax_nopriv_cortez_get_terms\', \'cortez_get_terms\' );
function cortez_get_terms() {
    $data = esc_sql( $_POST );
    if ( ! wp_verify_nonce( $data[\'nonce\'], \'cortez_nonce_security_key\' ) ) {
        wp_die( \'Security check\' );
    }
    if ( ! isset( $data[\'term_chosen\'] ) || empty( $data[\'term_chosen\'] ) ) {
        wp_die( \'No Term Chosen\' );
    }

    $tipos_bicicletas       = \'tipos_bicicletas\';
    $modelos_bicicletas     = \'modelos_bicicletas\';
    $marcas_bicicletas      = \'marcas_bicicletas\';
    $tax_tipos_bicicletas   = get_terms( $tipos_bicicletas, array( \'hide_empty\' => false ) );
    $tax_modelos_bicicletas = get_terms( $modelos_bicicletas, array( \'hide_empty\' => false ) );
    $tax_marcas_bicicletas  = get_terms( $marcas_bicicletas, array( \'hide_empty\' => false ) );

    $json = json_encode( $tax_tipos_bicicletas );
    if ( $data[\'term_chosen\'] == \'bicicleta\' ) {
        echo $json;
    }


    wp_die(); //stop function once you\'ve echoed (returned) what you need.
}
最后,我们通过定制将一切联系在一起。js。这是一个需要在主题(wp-content/themes/your\\u-theme/custom.js)内创建的文件。创建后,将以下代码加载到其中。这与ajax调用相同,只是它使用了我们在wp\\u localize\\u脚本中设置的变量作为url,这是一个POST请求,而不是GET请求。

请注意,我还传递了一个“data”属性。这是我将发布到WordPress ajax处理程序(admin ajax.php)的一组数据。这必须包括一个“action”节点,它是您的ajax调用,在我们的示例中是cortez\\u get\\u terms。没有这个WordPress不知道该怎么办。

你会看到我路过term_chosen 在该数据属性中也是如此。这是用户选择的下拉列表的选择值。我们将其发送到ajax脚本(在functions.php中的前面函数中),如果您看一下,我们可以使用该变量来双重检查用户的选择并输出正确的数据。

/*
 * Filename: custom.js
 *
 */

jQuery(function ($) {
    $("#opt-categorias").change(function () {
        var opt_categorias = $("#opt-categorias").val();
        $.ajax({
            type: "POST",
            url: clocal.ajaxurl,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: {
                \'action\': \'cortez_get_terms\',
                \'nonce\': clocal.nonce,
                \'term_chosen\': opt_categorias,
            },
            success: function (data) {
                $("#opt_tipo").empty();
                $("#opt_tipo").append("<option value=\'\'> Tipo de produto</option>");
                $.each(data, function (i, item) {
                    $("#opt_tipo").append(\'<option value="\' + data[i].slug + \'">\' + data[i].name + \'</option>\');

                });
            },
            error: function(error){
            },
            complete: function () {
            }
        });
    });
});
这是一个快速而肮脏的例子,肯定还有更多的建议,但我认为这应该让你开始。请务必查看我在函数注释中添加的“源”链接,如果您有任何问题,请告诉我。

结束

相关推荐

如何在定制器预览中使GET_THEME_MOD与AJAX一起工作

当AJAX在模板部件中调用get\\u theme\\u mod时,是否可以在自定义程序预览窗格中刷新后使其工作?我有一个主题,可以加载滚动(无限滚动)上的帖子,除了没有在定制器预览中输出更新的主题mods外,其他一切都正常。当我点击保存按钮时,它只输出新的主题mods。你知道如何在刷新后进行更新吗?My control settings: \'id\' => \'show_caption\', \'type\' => \'select\',&