2016-11-22 2 views
2

Я хочу добавить поиск деталей на веб-сайт на WordPress. В настоящее время я выполнял эту функцию, но мне сложно интегрировать ее в WordPress. Я попробовал несколько способов, но динамический зависимый блок выбора все еще не работает.Интеграция динамического зависимого окна выбора в WordPress

Я после этого учебника: Dynamic Dependent Select Box using jQuery, Ajax and PHP

Ниже приведены мой код, который хорошо работает вне WordPress.

index.php

<head> 
    <script src="http://code.jquery.com/jquery-3.1.1.min.js"></script> 
    <script src="js/ajax-ps.js"></script> 
</head> 

<body> 
    <form class="select-boxes" action="ps-result.php" method="POST"> 
    <?php 
     include('dbConfig.php');    
     $query = $db->query("SELECT * FROM ps_manufact WHERE status = 1 ORDER BY manufact_name ASC"); 
     $rowCount = $query->num_rows; 
    ?> 
     <select name="manufacturer" id="manufact" class="col-md-2 col-sm-2 col-xs-10" onchange="manufactText(this)"> 
      <option value="">Select Manufacturer</option> 
      <?php 
       if($rowCount > 0){ 
        while($row = $query->fetch_assoc()){ 
         echo '<option value="'.$row['manufact_id'].'">'.$row['manufact_name'].'</option>'; 
        } 
       }else{ 
        echo '<option value="">Manufacturer Not Available</option>'; 
       } 
      ?> 
     </select> 
     <input id="manufacturer_text" type="hidden" name="manufacturer_text" value=""/> 
     <script type="text/javascript"> 
      function manufactText(ddl) { 
       document.getElementById('manufacturer_text').value = ddl.options[ddl.selectedIndex].text; 
      } 
     </script> 

     <select name="type" id="type" class="col-md-2 col-sm-2 col-xs-10" onchange="typeText(this)"> 
      <option value="">Select Manufacturer First</option> 
     </select> 
     <input id="type_text" type="hidden" name="type_text" value=""/> 
     <script type="text/javascript"> 
      function typeText(ddl) { 
       document.getElementById('type_text').value = ddl.options[ddl.selectedIndex].text; 
      } 
     </script> 

     <select name="year" id="year" class="col-md-2 col-sm-2 col-xs-10" onchange="yearText(this)"> 
      <option value="">Select Type First</option> 
     </select> 
     <input id="year_text" type="hidden" name="year_text" value=""/> 
     <script type="text/javascript"> 
      function yearText(ddl) { 
       document.getElementById('year_text').value = ddl.options[ddl.selectedIndex].text; 
      } 
     </script> 

     <select name="model" id="model" class="col-md-2 col-sm-2 col-xs-10" onchange="modelText(this)"> 
      <option value="">Select Year First</option> 
     </select> 
     <input id="model_text" type="hidden" name="model_text" value=""/> 
     <script type="text/javascript"> 
      function modelText(ddl) { 
       document.getElementById('model_text').value = ddl.options[ddl.selectedIndex].text; 
      } 
     </script> 

     <input type="submit" name="search" id="search" class="col-md-2 col-sm-2 col-xs-10" value="Search"> 
    </form> 
</body> 

ajax-ps.js

$(document).ready(function(){ 
    $('#manufact').on('change',function(){ 
     var manufactID = $(this).val(); 
     if(manufactID){ 
      $.ajax({ 
       cache: false, 
       type:'POST', 
       url:'ajax-data.php', 
       data:'manufact_id='+manufactID, 
       success:function(type_data){ 
        $('#type').html(type_data); 
        $('#year').html('<option value="">Select Type First</option>'); 
       } 
      }); 
     }else{ 
      $('#type').html('<option value="">Select Manufact First</option>'); 
      $('#year').html('<option value="">Select Type First</option>'); 
     } 
    }); 

    $('#type').on('change',function(){ 
     var typeID = $(this).val(); 
     if(typeID){ 
      $.ajax({ 
       cache: false, 
       type:'POST', 
       url:'ajax-data.php', 
       data:'type_id='+typeID, 
       success:function(year_data){ 
        $('#year').html(year_data); 
        $('#model').html('<option value="">Select Year First</option>'); 
       } 
      }); 
     }else{ 
      $('#year').html('<option value="">Select Type First</option>'); 
      $('#model').html('<option value="">Select Year First</option>'); 
     } 
    }); 

    $('#year').on('change',function(){ 
     var yearID = $(this).val(); 
     if(yearID){ 
      $.ajax({ 
       cache: false, 
       type:'POST', 
       url:'ajax-data.php', 
       data:'year_id='+yearID, 
       success:function(model_data){ 
        $('#model').html(model_data); 
       } 
      }); 
     }else{ 
      $('#model').html('<option value="">Select Year First</option>'); 
     } 
    }); 
}); 

ajax-data.php

include('dbConfig.php'); 

if(isset($_POST["manufact_id"]) && !empty($_POST["manufact_id"])){ 
    $query = $db->query("SELECT * FROM ps_type WHERE manufact_id = ".$_POST['manufact_id']." AND status = 1 ORDER BY type_name ASC"); 

    $rowCount = $query->num_rows; 

    if($rowCount > 0){ 
     echo '<option value="">Select Type</option>'; 
     while($row = $query->fetch_assoc()){ 
      echo '<option value="'.$row['type_id'].'">'.$row['type_name'].'</option>'; 
     } 
    }else{ 
     echo '<option value="">Type Not Available</option>'; 
    } 
} 

if(isset($_POST["type_id"]) && !empty($_POST["type_id"])){ 
    $query = $db->query("SELECT * FROM ps_year WHERE type_id = ".$_POST['type_id']." AND status = 1 ORDER BY year_name ASC"); 

    $rowCount = $query->num_rows; 

    if($rowCount > 0){ 
     echo '<option value="">Select Year</option>'; 
     while($row = $query->fetch_assoc()){ 
      echo '<option value="'.$row['year_id'].'">'.$row['year_name'].'</option>'; 
     } 
    }else{ 
     echo '<option value="">Year Not Available</option>'; 
    } 
} 

if(isset($_POST["year_id"]) && !empty($_POST["year_id"])){ 
    $query = $db->query("SELECT * FROM ps_model WHERE year_id = ".$_POST['year_id']." AND status = 1 ORDER BY model_name ASC"); 

    $rowCount = $query->num_rows; 

    if($rowCount > 0){ 
     echo '<option value="">Select Model</option>'; 
     while($row = $query->fetch_assoc()){ 
      echo '<option value="'.$row['model_id'].'">'.$row['model_name'].'</option>'; 
     } 
    }else{ 
     echo '<option value="">Model Not Available</option>'; 
    } 
} 

Теперь проблема не будет, если выбрать первый ящик, второй становится пустым, ничего возвращается из база данных:

Capture - After select the first box

Действительно appreicate Christos Lytras, чтобы помочь мне решить предыдущую проблему.

У меня возникла новая проблема с action="ps-result.php" в строке <form class="select-boxes" action="ps-result.php" method="POST">.

ps-result.php

<?php 
if (isset($_POST['search'])) { 
    $clauses = array(); 
    if (isset($_POST['manufacturer_text']) && !empty($_POST['manufacturer_text'])) { 
     $clauses[] = "`manufacturer` = '{$_POST['manufacturer_text']}'"; 
    } 
    if (isset($_POST['type_text']) && !empty($_POST['type_text'])) { 
     $clauses[] = "`type` = '{$_POST['type_text']}'"; 
    } 
    if (isset($_POST['year_text']) && !empty($_POST['year_text'])) { 
     $clauses[] = "`year` = '{$_POST['year_text']}'"; 
    } 
    if (isset($_POST['model_text']) && !empty($_POST['model_text'])) { 
     $clauses[] = "`model` = '{$_POST['model_text']}'"; 
    } 
    $where = !empty($clauses) ? ' where '.implode(' and ',$clauses) : ''; 

    $sql = "SELECT * FROM `wp_products` ". $where; 
    $result = filterTable($sql); 
} 
else { 
    $sql = "SELECT * FROM `wp_products` WHERE `manufacturer`=''"; 
    $result = filterTable($sql); 
} 

function filterTable($sql) { 
    $con = mysqli_connect("localhost", "root", "root", "i2235990_wp2"); 
    if (!$con) { 
     die('Could not connect: ' . mysqli_error($con)); 
    } 
    $filter_Result = mysqli_query($con, $sql); 
    return $filter_Result; 
} 
?> 

<?php get_header(); ?> 

<div class="container"> 
... 
</div> 

<?php get_footer(); ?> 

Теперь, когда я нажимаю Search, он возвращает

Fatal error: Call to undefined function get_header() in /Applications/MAMP/htdocs/wordpress/wp-content/themes/myTheme/inc/ps-result.php on line 42.

+0

У вас есть ошибки PHP/Javascript в теле или консоли? А также, как вы пытаетесь интегрировать это в Wordpress? –

+0

@ Christos Lytras У меня есть вопрос, чтобы понять это. –

+0

@ L-Leo вы можете сделать эту работу, если вы измените «url:« ajax-data.php »,« чтобы указать на правый URL-адрес ajax-data.php », связанный с вашим корнем домена (например:'/ajax_calls/Ajax-data.php'); однако есть «правильный» способ иметь такую ​​функциональность в wordpress, которая описана здесь [AJAX в плагинах] (https://codex.wordpress.org/AJAX_in_Plugins). Вы должны использовать действия Wordpress AJAX и объект базы данных Wordpress. Но если вы не хотите вникать в это, просто измените URL-адрес файла PHP в своем вызове ajax, и он должен работать. –

ответ

1

Правильный способ сделать это, чтобы создать WordPress шорткод, а затем использовать это шорткод везде, где вы хотите, страницу или пост, но если вы хотите создать что-то более конкретно, то вы должны создать небольшой плагин wordpress. Я не буду вдаваться в это, но на самом деле не так уж сложно создать простой плагин wordpress с такой функциональностью. Я расскажу о том, как вы можете работать в Wordpress с файлами и кодом, который у вас уже есть. Я предполагаю, что у вас уже есть таблицы вашего примера. Мои таблицы таковы:

wp_citytours_dynsel_cities 
wp_citytours_dynsel_states 
wp_citytours_dynsel_countries 

Я импортировал некоторые данные, и у меня есть все эти таблицы, заполненные соответствующими данными. Я могу предоставить некоторые sql-файлы, если вам нравится, но я полагаю, что у вас уже есть таблицы, заполненные соответствующими данными для каждой таблицы.

Моего тестовая тема корневого каталога:

/wp-content/themes/citytours/ 

Я создал каталог под мою тему корневой директории, и я включил все файлы кода там, так что у нас есть 3 файла:

/wp-content/themes/citytours/dynsel/index-partial.php

<?php 
//Include database configuration file 
include('dbConfig.php'); 

//Get all country data 
$query = $db->query("SELECT * FROM wp_citytours_dynsel_countries WHERE status = 1 ORDER BY country_name ASC"); 

//Count total number of rows 
$rowCount = $query->num_rows; 
?> 
<select name="country" id="country"> 
    <option value="">Select Country</option> 
    <?php 
    if($rowCount > 0){ 
     while($row = $query->fetch_assoc()){ 
      echo '<option value="'.$row['country_id'].'">'.$row['country_name'].'</option>'; 
     } 
    }else{ 
     echo '<option value="">Country not available</option>'; 
    } 
    ?> 
</select> 

<select name="state" id="state"> 
    <option value="">Select country first</option> 
</select> 

<select name="city" id="city"> 
    <option value="">Select state first</option> 
</select> 

<script type="text/javascript"> 
jQuery(function($) { 
    $('#country').on('change',function(){ 
     var countryID = $(this).val(); 
     if(countryID){ 
      $.ajax({ 
       type:'POST', 
       url:'<?php echo home_url('wp-content/themes/citytours/dynsel/ajaxData.php') ?>', 
       data:'country_id='+countryID, 
       success:function(html){ 
        $('#state').html(html); 
        $('#city').html('<option value="">Select state first</option>'); 
       } 
      }); 
     }else{ 
      $('#state').html('<option value="">Select country first</option>'); 
      $('#city').html('<option value="">Select state first</option>'); 
     } 
    }); 

    $('#state').on('change',function(){ 
     var stateID = $(this).val(); 
     if(stateID){ 
      $.ajax({ 
       type:'POST', 
       url:'<?php echo home_url('wp-content/themes/citytours/dynsel/ajaxData.php') ?>', 
       data:'state_id='+stateID, 
       success:function(html){ 
        $('#city').html(html); 
       } 
      }); 
     }else{ 
      $('#city').html('<option value="">Select state first</option>'); 
     } 
    }); 
}); 
</script> 

/wp-content/themes/citytours/dynsel/dbConfig.php

<?php 
//db details 
$dbHost = 'localhost'; 
$dbUsername = 'xxxx'; 
$dbPassword = 'xxxx'; 
$dbName = 'xxxx'; 

//Connect and select the database 
$db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName); 

if ($db->connect_error) { 
    die("Connection failed: " . $db->connect_error); 
} 
?> 

/wp-content/themes/citytours/dynsel/ajaxData.php

<?php 
//Include database configuration file 
include('dbConfig.php'); 

if(isset($_POST["country_id"]) && !empty($_POST["country_id"])){ 
    //Get all state data 
    $query = $db->query("SELECT * FROM wp_citytours_dynsel_states WHERE country_id = ".$_POST['country_id']." AND status = 1 ORDER BY state_name ASC"); 

    //Count total number of rows 
    $rowCount = $query->num_rows; 

    //Display states list 
    if($rowCount > 0){ 
     echo '<option value="">Select state</option>'; 
     while($row = $query->fetch_assoc()){ 
      echo '<option value="'.$row['state_id'].'">'.$row['state_name'].'</option>'; 
     } 
    }else{ 
     echo '<option value="">State not available</option>'; 
    } 
} 

if(isset($_POST["state_id"]) && !empty($_POST["state_id"])){ 
    //Get all city data 
    $query = $db->query("SELECT * FROM wp_citytours_dynsel_cities WHERE state_id = ".$_POST['state_id']." AND status = 1 ORDER BY city_name ASC"); 

    //Count total number of rows 
    $rowCount = $query->num_rows; 

    //Display cities list 
    if($rowCount > 0){ 
     echo '<option value="">Select city</option>'; 
     while($row = $query->fetch_assoc()){ 
      echo '<option value="'.$row['city_id'].'">'.$row['city_name'].'</option>'; 
     } 
    }else{ 
     echo '<option value="">City not available</option>'; 
    } 
} 
?> 

Как вы можете видеть, index-partial.php теперь содержит только необходимый код, без <body>, <head> и файлы сценариев включены. Wordpress уже включает jQuery в приложение для большинства тем, но вы всегда должны это проверять. Теперь вы можете добавить функциональность, где бы вы ни хотели, даже на тему index.php файл, но всегда с осторожностью. Я использовал один шаблон шаблона темы, который является single-post.php. Я включил пример кода под основным телом в div. Я просто включить index-partial.php так:

<div class="<?php echo esc_attr($content_class); ?>"> 
    <div class="box_style_1"> 
    ... 
    </div><!-- end box_style_1 --> 

    <div class="box_style_1"> 
     <?php include(__DIR__.'/dynsel/index-partial.php'); ?> 
    </div> 
</div><!-- End col-md-9--> 

я также использовал функцию WordPress home_url, чтобы иметь надлежащий URL укоренились для файла ajaxData.php так:

url:'<?php echo home_url('wp-content/themes/citytours/dynsel/ajaxData.php') ?>' 

Теперь, если вы следовали все эти шаги, тогда вам нужно, чтобы ваш пример кода работал под каждым сообщением. Теперь вы можете включить его там, где хотите, используя эту строку кода <?php include(__DIR__.'/dynsel/index-partial.php'); ?>.

enter image description here

Пожалуйста, дайте мне знать, если это работает для вас.

+0

Очень ценю вашу помощь! Но у него все еще есть такое же проблемное шоу в захвате. Я также попытался поместить javascript в независимый js-файл, консоль вернула ошибку 'Uncaught SyntaxError: Неожиданный идентификатор' с' url: '' ' –

+0

Можете ли вы обновить снимок экрана вашей консоли Chrome/Firefox, чтобы увидеть ошибку? –

+0

Я только что исправил проблему, ошибка заключается в том, как я включаю 'dbConfig.php'. Зависимый блок выбора теперь работает. У меня есть новая проблема с 'action =" ps-result.php ". Я скоро обновлю вопрос. –

Смежные вопросы