如何从头开始在 WordPress 中创建自定义实时搜索
how to create a custom live search in WordPress from scratch
我是 WordPress 的新手,我尝试使用 ajax 创建实时搜索,我希望当用户按下按钮时出现一个框,搜索结果显示在该框中。
为此,我在我的主题文件夹中创建了一个名为 livesearch
的文件夹,在该文件夹中我放置了一个名为 search-live.php
的文件,该文件中的代码如下所示:
<?php
//echo $_GET['search'];
$test = GetMySearchResult($_GET['search']);
print_r($test);
在我的 functions.php
文件中,我创建了一个名为 GetMySearchResult
的函数,如下所示:
function GetMySearchResult($search){
global $wpdb;
$myrows = $wpdb->get_results( "SELECT * FROM wp_posts post_type = post ID LIKE %" . $search . "%" );
return $myrows;
}
add_action('init', 'GetMySearchResult');
然后我使用 ajax 将数据发送到 search-live.php
,代码如下:
<script>
var GetSearch = document.getElementById('search');
GetSearch.addEventListener("keyup", function(){
//InfoData = {slug:GetSearch.value}
$.ajax({
type: "GET",
url: '<?php echo get_site_url(); ?>/wp-content/themes/webranko/livesearch/search-live.php?search=' + GetSearch.value ,
data: '',
datatype: "html",
success: function(result) {
console.log(result);
}
});
});
</script>
我已经 $_GET['search'];
并且一切正常,我可以在我的控制台中看到结果但是当我调用 GetMySearchResult($_GET['search'])
它给了我这样一个致命错误:
致命错误:未捕获错误:调用 C:\xampp\htdocs\web\wp-content\themes\webranko\livesearch\search-live.php:3 中未定义的函数 GetMySearchResult()
堆栈跟踪:
#0 {主要}
扔在 C:\xampp\htdocs\web\wp-content\themes\webranko\livesearch\search-live.php 线上 3
我错过了什么或做错了什么?
我相信您无法获得一种绝对的解决方案,因为您可以通过多种方式应用实时搜索。但所有这些都应该经过 JavaScript。您可以在下面找到我应用实时搜索的代码片段。我知道它需要解释很多,但我希望你能阅读它并理解代码的流程,因此我可以提供一点帮助。
以下代码的应用你可以在this网站的搜索按钮中找到它,该网站仍在开发过程中所以不要担心设计,只需按搜索按钮即可。希望我能帮到你!
/*
=================================================================================
LIVE SEARCH
=================================================================================
*/
// VARs =======================================================================
var searchArea = $('#modal-search-input');
var spinner = `
<div class="search_ajax_loader">
<svg viewBox="0 0 135 140" xmlns="http://www.w3.org/2000/svg">
<rect y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="30" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="60" width="15" height="140" rx="6">
<animate attributeName="height"
begin="0s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="90" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="120" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
</svg>
</div>
`;
var isSpinnerVisible = false;
var previousValue, typingTimer;
// Excute functions ===============================================================
addSearchHTML();
SearchBtnStyle();
votEvents();
// define functions ================================================================
function addSearchHTML () {
$('.mainmenu').append(`
<div class="widget widget_search">
<div id="vot_search_button"></div>
</div>
`);
$('#search_modal').append(`
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">
<i class="rt-icon2-cross2"></i>
</span>
</button>
<div class="widget widget_search">
<div class="searchform search-form form-inline" >
<div class="form-group">
<input type="text" value="" name="search" class="form-control" placeholder=" ما الذي تريد أ ن تبحث عنه؟" id="modal-search-input">
</div>
<div id="inner_search_btn"></div>
</div>
</div>
<div id="result_area" class="row">
<fieldset id="result_area_sermons" class="search_column col-md-4 col-sm-12">
<legend class="search_legend">
عظات
</legend>
<ul class="search_column_result">
</ul>
</fieldset>
<fieldset id="result_area_tvshows" class="search_column col-md-4 col-sm-12">
<legend class="search_legend">
برامج تلفزيونية
</legend>
<ul class="search_column_result">
</ul>
</fieldset>
<fieldset id="result_area_articles" class="search_column col-md-4 col-sm-12">
<legend class="search_legend">
مقالات
</legend>
<ul class="search_column_result">
</ul>
</fieldset>
</div>
`);
if ($('body').hasClass('home')) {
$('.widget_search').addClass('widget_search_homepage');
}
}
function SearchBtnStyle () {
var SearchBtnPadding = $('.mainmenu .menu-item > a').css('padding');
var SearchBtnMargin = $('.mainmenu .menu-item > a').css('margin');
$('#vot_search_button').css('padding', SearchBtnPadding);
$('#vot_search_button').css('margin', SearchBtnMargin);
}
function votEvents (){
$('#vot_search_button').on('click', openOverlay);
$('#modal-search-input').on("keyup", typingLogic);
}
// event handlers functions ==========================================================
function openOverlay (){
$('#search_modal').modal('show').find('input').first().focus();
}
function typingLogic () {
var searchArea = $('#modal-search-input'),
resultsDivSermons = $('#result_area #result_area_sermons .search_column_result');
resultsDivTVshows = $('#result_area #result_area_tvshows .search_column_result');
resultsDivArticles = $('#result_area #result_area_articles .search_column_result');
if (searchArea.val() != previousValue) {
clearTimeout(typingTimer);
if (searchArea.val()) {
if (!isSpinnerVisible) {
resultsDivSermons.html(spinner);
resultsDivTVshows.html(spinner);
resultsDivArticles.html(spinner);
isSpinnerVisible = true;
}
typingTimer = setTimeout(getResults, 2000);
} else {
resultsDivSermons.html('');
resultsDivTVshows.html('');
resultsDivArticles.html('');
isSpinnerVisible = false;
}
}
previousValue = searchArea.val();
}
function getResults () {
var searchArea = $('#modal-search-input');
//sermons
var sermons_url = vot_vars.root_directory + '/wp-json/wp/v2/vot-sermons?search=' + searchArea.val();
$.getJSON(sermons_url, sermons => {
$('#result_area #result_area_sermons .search_column_result').prepend(`
${sermons.length ? '' : '<li>لم نستطيع العثور على عظة تطابق بحثك</li>'}
${sermons.map(item => `<li><a href="${item.link}">${votChangeNumbersToArabic(item.title.rendered)}</a></li>`).join('')}
${sermons.length ? '' : ''}
`);
isSpinnerVisible = false;
$('#result_area #result_area_sermons .search_ajax_loader').hide();
});
//tvshows
var tvshows_url = vot_vars.root_directory + '/wp-json/wp/v2/vot-tvshows?search=' + searchArea.val();
$.getJSON(tvshows_url, sermons => {
$('#result_area #result_area_tvshows .search_column_result').prepend(`
${sermons.length ? '' : '<li>لم نستطيع العثور على برنامج تلفزيوني يطابق بحثك</li>'}
${sermons.map(item => `<li><a href="${item.link}">${votChangeNumbersToArabic(item.title.rendered)}</a></li>`).join('')}
${sermons.length ? '' : ''}
`);
isSpinnerVisible = false;
$('#result_area #result_area_tvshows .search_ajax_loader').hide();
});
//articles
var articles_url = vot_vars.root_directory + '/wp-json/wp/v2/vot-articles?search=' + searchArea.val();
$.getJSON(articles_url, sermons => {
$('#result_area #result_area_articles .search_column_result').prepend(`
${sermons.length ? '' : '<li>لم نستطيع العثور على مقالة تطابق بحثك</li>'}
${sermons.map(item => `<li><a href="${item.link}">${votChangeNumbersToArabic(item.title.rendered)}</a></li>`).join('')}
${sermons.length ? '' : ''}
`);
isSpinnerVisible = false;
$('#result_area #result_area_articles .search_ajax_loader').hide();
});
}
要创建实时搜索,只需向 wp-json
发送 GET 请求即可,无需进行新查询
只需在 ajax 请求中使用此 URL:
<?php echo get_site_url(); ?>wp-json/wp/v2/posts?search=' + GetSearch.value
所以ajax代码应该是这样的:
<script>
var GetSearch = document.getElementById('search');
GetSearch.addEventListener("keyup", function(){
//InfoData = {slug:GetSearch.value}
$.ajax({
type: "GET",
url: '<?php echo get_site_url(); ?>wp-json/wp/v2/posts?search=' + GetSearch.value ,
data: '',
datatype: "html",
success: function(result) {
console.log(result);
}
});
});
</script>
和 HTML 搜索输入应该是这样的:
<input type="search" id="search" name="search" placeholder="search" autocomplete="off"/>
你必须关闭输入的自动完成
我是 WordPress 的新手,我尝试使用 ajax 创建实时搜索,我希望当用户按下按钮时出现一个框,搜索结果显示在该框中。
为此,我在我的主题文件夹中创建了一个名为 livesearch
的文件夹,在该文件夹中我放置了一个名为 search-live.php
的文件,该文件中的代码如下所示:
<?php
//echo $_GET['search'];
$test = GetMySearchResult($_GET['search']);
print_r($test);
在我的 functions.php
文件中,我创建了一个名为 GetMySearchResult
的函数,如下所示:
function GetMySearchResult($search){
global $wpdb;
$myrows = $wpdb->get_results( "SELECT * FROM wp_posts post_type = post ID LIKE %" . $search . "%" );
return $myrows;
}
add_action('init', 'GetMySearchResult');
然后我使用 ajax 将数据发送到 search-live.php
,代码如下:
<script>
var GetSearch = document.getElementById('search');
GetSearch.addEventListener("keyup", function(){
//InfoData = {slug:GetSearch.value}
$.ajax({
type: "GET",
url: '<?php echo get_site_url(); ?>/wp-content/themes/webranko/livesearch/search-live.php?search=' + GetSearch.value ,
data: '',
datatype: "html",
success: function(result) {
console.log(result);
}
});
});
</script>
我已经 $_GET['search'];
并且一切正常,我可以在我的控制台中看到结果但是当我调用 GetMySearchResult($_GET['search'])
它给了我这样一个致命错误:
致命错误:未捕获错误:调用 C:\xampp\htdocs\web\wp-content\themes\webranko\livesearch\search-live.php:3 中未定义的函数 GetMySearchResult() 堆栈跟踪: #0 {主要} 扔在 C:\xampp\htdocs\web\wp-content\themes\webranko\livesearch\search-live.php 线上 3
我错过了什么或做错了什么?
我相信您无法获得一种绝对的解决方案,因为您可以通过多种方式应用实时搜索。但所有这些都应该经过 JavaScript。您可以在下面找到我应用实时搜索的代码片段。我知道它需要解释很多,但我希望你能阅读它并理解代码的流程,因此我可以提供一点帮助。
以下代码的应用你可以在this网站的搜索按钮中找到它,该网站仍在开发过程中所以不要担心设计,只需按搜索按钮即可。希望我能帮到你!
/*
=================================================================================
LIVE SEARCH
=================================================================================
*/
// VARs =======================================================================
var searchArea = $('#modal-search-input');
var spinner = `
<div class="search_ajax_loader">
<svg viewBox="0 0 135 140" xmlns="http://www.w3.org/2000/svg">
<rect y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="30" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="60" width="15" height="140" rx="6">
<animate attributeName="height"
begin="0s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="90" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="120" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
</svg>
</div>
`;
var isSpinnerVisible = false;
var previousValue, typingTimer;
// Excute functions ===============================================================
addSearchHTML();
SearchBtnStyle();
votEvents();
// define functions ================================================================
function addSearchHTML () {
$('.mainmenu').append(`
<div class="widget widget_search">
<div id="vot_search_button"></div>
</div>
`);
$('#search_modal').append(`
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">
<i class="rt-icon2-cross2"></i>
</span>
</button>
<div class="widget widget_search">
<div class="searchform search-form form-inline" >
<div class="form-group">
<input type="text" value="" name="search" class="form-control" placeholder=" ما الذي تريد أ ن تبحث عنه؟" id="modal-search-input">
</div>
<div id="inner_search_btn"></div>
</div>
</div>
<div id="result_area" class="row">
<fieldset id="result_area_sermons" class="search_column col-md-4 col-sm-12">
<legend class="search_legend">
عظات
</legend>
<ul class="search_column_result">
</ul>
</fieldset>
<fieldset id="result_area_tvshows" class="search_column col-md-4 col-sm-12">
<legend class="search_legend">
برامج تلفزيونية
</legend>
<ul class="search_column_result">
</ul>
</fieldset>
<fieldset id="result_area_articles" class="search_column col-md-4 col-sm-12">
<legend class="search_legend">
مقالات
</legend>
<ul class="search_column_result">
</ul>
</fieldset>
</div>
`);
if ($('body').hasClass('home')) {
$('.widget_search').addClass('widget_search_homepage');
}
}
function SearchBtnStyle () {
var SearchBtnPadding = $('.mainmenu .menu-item > a').css('padding');
var SearchBtnMargin = $('.mainmenu .menu-item > a').css('margin');
$('#vot_search_button').css('padding', SearchBtnPadding);
$('#vot_search_button').css('margin', SearchBtnMargin);
}
function votEvents (){
$('#vot_search_button').on('click', openOverlay);
$('#modal-search-input').on("keyup", typingLogic);
}
// event handlers functions ==========================================================
function openOverlay (){
$('#search_modal').modal('show').find('input').first().focus();
}
function typingLogic () {
var searchArea = $('#modal-search-input'),
resultsDivSermons = $('#result_area #result_area_sermons .search_column_result');
resultsDivTVshows = $('#result_area #result_area_tvshows .search_column_result');
resultsDivArticles = $('#result_area #result_area_articles .search_column_result');
if (searchArea.val() != previousValue) {
clearTimeout(typingTimer);
if (searchArea.val()) {
if (!isSpinnerVisible) {
resultsDivSermons.html(spinner);
resultsDivTVshows.html(spinner);
resultsDivArticles.html(spinner);
isSpinnerVisible = true;
}
typingTimer = setTimeout(getResults, 2000);
} else {
resultsDivSermons.html('');
resultsDivTVshows.html('');
resultsDivArticles.html('');
isSpinnerVisible = false;
}
}
previousValue = searchArea.val();
}
function getResults () {
var searchArea = $('#modal-search-input');
//sermons
var sermons_url = vot_vars.root_directory + '/wp-json/wp/v2/vot-sermons?search=' + searchArea.val();
$.getJSON(sermons_url, sermons => {
$('#result_area #result_area_sermons .search_column_result').prepend(`
${sermons.length ? '' : '<li>لم نستطيع العثور على عظة تطابق بحثك</li>'}
${sermons.map(item => `<li><a href="${item.link}">${votChangeNumbersToArabic(item.title.rendered)}</a></li>`).join('')}
${sermons.length ? '' : ''}
`);
isSpinnerVisible = false;
$('#result_area #result_area_sermons .search_ajax_loader').hide();
});
//tvshows
var tvshows_url = vot_vars.root_directory + '/wp-json/wp/v2/vot-tvshows?search=' + searchArea.val();
$.getJSON(tvshows_url, sermons => {
$('#result_area #result_area_tvshows .search_column_result').prepend(`
${sermons.length ? '' : '<li>لم نستطيع العثور على برنامج تلفزيوني يطابق بحثك</li>'}
${sermons.map(item => `<li><a href="${item.link}">${votChangeNumbersToArabic(item.title.rendered)}</a></li>`).join('')}
${sermons.length ? '' : ''}
`);
isSpinnerVisible = false;
$('#result_area #result_area_tvshows .search_ajax_loader').hide();
});
//articles
var articles_url = vot_vars.root_directory + '/wp-json/wp/v2/vot-articles?search=' + searchArea.val();
$.getJSON(articles_url, sermons => {
$('#result_area #result_area_articles .search_column_result').prepend(`
${sermons.length ? '' : '<li>لم نستطيع العثور على مقالة تطابق بحثك</li>'}
${sermons.map(item => `<li><a href="${item.link}">${votChangeNumbersToArabic(item.title.rendered)}</a></li>`).join('')}
${sermons.length ? '' : ''}
`);
isSpinnerVisible = false;
$('#result_area #result_area_articles .search_ajax_loader').hide();
});
}
要创建实时搜索,只需向 wp-json
发送 GET 请求即可,无需进行新查询
只需在 ajax 请求中使用此 URL:
<?php echo get_site_url(); ?>wp-json/wp/v2/posts?search=' + GetSearch.value
所以ajax代码应该是这样的:
<script>
var GetSearch = document.getElementById('search');
GetSearch.addEventListener("keyup", function(){
//InfoData = {slug:GetSearch.value}
$.ajax({
type: "GET",
url: '<?php echo get_site_url(); ?>wp-json/wp/v2/posts?search=' + GetSearch.value ,
data: '',
datatype: "html",
success: function(result) {
console.log(result);
}
});
});
</script>
和 HTML 搜索输入应该是这样的:
<input type="search" id="search" name="search" placeholder="search" autocomplete="off"/>
你必须关闭输入的自动完成