0

所以我想使用多个过滤器过滤来自 db 的数据。我现在有 2 个选择,GENDERMARITAL STATUS。如果我从GENDER中选择例如'male',而在MARITAL STATUS中没有任何内容,我希望结果是所有具有选项'male'的数据。如果我还从 MARITAL STATUS 中选择“离婚”,那么结果将是同时具有“男性”和“离婚”选项的数据。

<div class="sidebar-filters">
  <div class="filters">
      <span>Gender</span>
      <select id="gender" name="gender">
         <option value="">Please select gender</option>
         <option value="male">male</option>
         <option value="female">female</option>
         <option value="agender">agender</option>
      </select>

      <span>Marital Status</span>
      <select id="marital_status" name="marital_status">
         <option value="">Please select marital status</option>
         <option value="married">married</option>
         <option value="widowed">widowed</option>
         <option value="separated">separated</option>
         <option value="divorced">divorced</option>
         <option value="single">single</option>
       </select>

    </div>
 </div>
<div class="results-wrap">
       <?php
            $query = "SELECT * FROM reviews1";
            $result = mysqli_query($conn, $query);
            $queryResult = mysqli_num_rows($result);
            if($queryResult > 0){
                 while($row = mysqli_fetch_assoc($result)){
                     echo "<div class='review-wrap'>
                           <h3>".$row['r_title']."</h3>
                           <p>".$row['age']."</p>
                           </div>";
                   }
           }else{
               echo "There are no results matching your search";
           }
       ?>

在我的 scripts.js 中,我有

$('#gender').on('change', function(){
     var value = $(this).val();
     $.ajax({
           url: "http://uttertest.ecom-shops.com/wp-admin/admin-ajax.php",
           type: 'POST',
           data: {
               action: 'filtering',
               request: value
                },
           beforeSend:function(){
                 $(".results-wrap").html("Wait...");
           },
           success:function(data){
                 $(".results-wrap").html(data);
           },
           error:function(xhr){
                 $(".results-wrap").html("Error");
           }
           });
 }); 

在functions.php中我有

add_action( 'wp_ajax_nopriv_filtering', 'filtering' );
add_action( 'wp_ajax_filtering', 'filtering' );

function filtering(){
    $server = "localhost";
    $username = "username";
    $password = "*****";
    $dbname = "databasename";
    $conn = mysqli_connect($server, $username, $password, $dbname);
          $request = $_POST['request'];
          $query = "SELECT * FROM reviews WHERE gender='$request'";
          $result = mysqli_query($conn, $query);
          $queryResult = mysqli_num_rows($result);
          if($queryResult > 0){
            while($row = mysqli_fetch_assoc($result)){
                echo "<div class='review-wrap'>
                <h3>".$row['r_title']."</h3>
                <p>".$row['age']."</p>
            </div>";
            }
          }else{
            echo "There are no results matching your search";
          }

   } 

到目前为止很好,如果我改变性别,数据显示正确,根据选择的选项。问题是如何结合选择中的两个选择?不仅这两个选择,还有一些将来在 html 中添加的复选框,选中或未选中,并更新从 db 获取的数据,每次更改选择或选中或未选中复选框时。

此外,我不需要提交按钮,只要选中复选框或选择 select 中的选项,更改就应适用于更改。

4

1 回答 1

0

当您使用 WordPress 时,不要使用您自己的数据库查询,因为您可以让 WordPress 为您完成所有繁重的工作,并确保数据在执行之前正确转义。看看WP_Query如何做到这一点。

这是一个粗略的起点。它假定帖子类型为reviews并且帖子状态设置为publish。从那里,如果设置了性别或婚姻状况,它会将其添加到元查询中以通过它进行搜索。

$args = array(
    'post_type'      => 'reviews',
    'post_status'    => 'publish',
    'orderby'        => 'post_title',
    'order'          => 'ASC',
    'meta_query'     => array(),
);

if ( '' != $gender ) {

    $args['meta_query'][] = array(
        'key'    => 'gender',
        'value'  => $gender
    );

}

if ( '' != $marital ) {

    $args['meta_query'][] = array(
        'key'    => 'marital',
        'value'  => $marital
    );

}

$posts = new WP_Query( $args );

上面还假设性别和婚姻字段在wp_postmeta表中也保存为 post 元数据。这是查询数据库最有效的方法。它使事情变得容易得多。

然后,这将返回一个对象,其中包含有关返回的帖子和实际使用的查询的信息。有关此处使用的查询类的更多信息,请参阅开发人员参考。

于 2018-05-11T10:44:40.277 回答