选项选项取决于wordpress管理页面

时间:2017-06-17 06:16:14

标签: php jquery html ajax wordpress

我有两个选择类别和类型,类型应该取决于类别选择,从数据库,这是我的代码。

HTML

    $ps_type_table_name = $wpdb->prefix . 'ps_type'; ?>

    <form method="post" action="">
     <label>Category :</label><br>
         <select id="category" name="category" 
         class="form-control">
               <?php
         $categories = $wpdb->get_col('SELECT DISTINCT category FROM '.$ps_type_table_name);
                 foreach ($categories as $category){ ?>

               <option value="<?php echo $category; ?>"><?php echo $category; ?></option>
                   <?php
                      }
                      ?>
             </select><br><br>

             <label>Types :</label><br>
            <select id="type" name="type" class="form-control">

           </select><br><br>
   </form>

的Ajax

$(document).ready(function(){
            $('#category').on('change',function(){
                var category = $(this).val();
                if(category){
                    $.ajax({
                        type:'POST',
                        url:'category-type-select.php',
                        data:'category_name='+category,
                            success:function (html) {
                        $('#type').html(html);
                    }
                    });
                }
            });
        });

PHP

 class Get_category_type{
 function __construct()
 {
if (isset($_POST['category_name']) && !empty($_POST['category_name'])) {
    global $wpdb;
    $category = $_POST['category_name'];
    $ps_type_table_name = $wpdb->prefix . 'ps_type';
    $types = $wpdb->get_col($wpdb->prepare('SELECT DISTINCT type FROM ' . $ps_type_table_name . ' WHERE category=%s', $category));

    foreach ($types as $type) {
        echo '<option value="' . $type . '">' . $type . '</option>';
    }
}
}

}

实际上,这是一个使用oops的WordPress插件,请帮我解决这个问题,我认为问题是在ajax代码中获取PHP文件,请告诉我如何在ajax URL中编写路径以获取WordPress中的该类文件插件

3 个答案:

答案 0 :(得分:0)

问题是你要替换选择元素的选项。你需要在ajax php中也有select元素。

的Ajax:

def mncity(arr):
    dx = np.diff(arr)
    return np.all(dx <= 0) or np.all(dx >= 0)

PHP:

$.ajax({
    type:'POST',
    url:'category-type-select.php',
    data:{category_name:category},
    success:function (html) {
                            //
    }
});

答案 1 :(得分:0)

1st:我认为只有在创建新对象实例时才会调用__construct函数。所以你需要创建实例来运行构造函数。

class Get_category_type {

 function __construct()
 {
   if (isset($_POST['category_name']) && !empty($_POST['category_name'])) {
       global $wpdb;
       $category = $_POST['category_name'];
       $ps_type_table_name = $wpdb->prefix . 'ps_type';
       $types = $wpdb->get_col($wpdb->prepare('SELECT DISTINCT type FROM ' . 
       $ps_type_table_name . ' WHERE category=%s', $category));

      foreach ($types as $type) 
      {
         $result.= '<option value="' . $type . '">' . $type . '</option>';
      }
      echo  $result;
   }
 }

}

 $obj = new Get_category_type(); //create instance here .

第二名:在foreach这样的

之后不要回复foreach内部的回声
foreach ($types as $type) 
{
   $result.= '<option value="' . $type . '">' . $type . '</option>';
}
echo  $result;

第三:你需要附加像这样的选项

  $('#type').empty();
  $('#type').append(html);

第4名:数据应该在ajax中正确发送

    data:{category_name:category},

第5名:在ajax中添加错误处理程序

$.ajax({
    type:'POST',
    url:'category-type-select.php',
    data:{category_name=category},
    success:function (html) {
         $('#type').empty();
         $('#type').append(html);
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});

测试目的:

出于测试目的。将POST方法更改为GET方法,如if (isset($_GET['category_name']) && !empty($_GET['category_name'])) { .. }然后直接在浏览器中调用url。 http://yoursite.com/category-type-select.php?category_name=here_any_one_category_name。如果它运行,那么porblem就在你的ajax部分。

答案 2 :(得分:0)

我得到了我的问题的解决方案,所以我发布了答案,以帮助一些需要的人,在WordPress中,有单独的钩子是使用ajax函数,这个程序如何使用它。

HTML

 $ps_type_table_name = $wpdb->prefix . 'ps_type'; ?>

<form method="post" action="">
 <label>Category :</label><br>
     <select id="category" name="category" 
     class="form-control">

           <?php
           $categories = $wpdb->get_col('SELECT DISTINCT category FROM '.$ps_type_table_name);
             foreach ($categories as $category){ ?>

       <option value="<?php echo $category; ?>"><?php echo $category; ?></option>

               <?php
                  }
                  ?>

         </select><br><br>

         <label>Types :</label><br>
        <select id="type" name="type" class="form-control">

       </select><br><br>

通过更改第一个选项

来获取第二个选项值的PHP代码
 public function get_type_by_category(){
    //echo file_get_contents('php://input'); for testing
    if (isset($_POST['ctgry']) && !empty($_POST['ctgry'])) {
        global $wpdb;
        $result = "";
        $category = $_POST['ctgry'];
        $ps_type_table_name = $wpdb->prefix . 'ps_type';
        $types = $wpdb->get_col($wpdb->prepare('SELECT DISTINCT type FROM ' . $ps_type_table_name . ' WHERE category=%s', $category));

        foreach ($types as $type) {
            $result .= '<option value="' . $type . '">' . $type . '</option>';
        }
        echo $result;
    }
}

将此功能挂钩到wordpress

    add_action('wp_ajax_get_type_by_category','get_type_by_category');
    add_action('wp_ajax_nopriv_get_type_by_category','get_type_by_category');

Ajax.js

   $(document).ready(function () {
   $('#category').change(function(){
    var ctgry=$(this).val();
    $.ajax({
        type:"post",
        url:ajaxurl,
        data:{'action':'get_type_by_category','ctgry':ctgry},
        cache:false,
        success:function (html) {
            $("#type").html(html);
            //alert(html);
        },
        error:function(request,string_error,error){
            alert(string_error);
        }

    });
});
$('#category').change();
});

将js连接到WordPress

    public function enqueue_scripts(){
 wp_enqueue_script('ps-admin-page-js', plugins_url('js/admin-page.js', dirname(__FILE__)),array('jquery'),'1.1.1',true);
 }
 add_action('wp_footer', 'enqueue_scripts');

我发现这种方式在WordPress插件开发中使用ajax,它对我有用。