問題描述
搜索大約兩天來找到我的問題的答案,我終於註冊了這個 StackExchange 。 🙂
我的問題不簡單,所以我需要從一開始就開始。但是給你一個這個帖子的想法:同時我的插件正在工作,但我不喜歡的代碼。我認為有更好的方法來解決這個問題,所以我正在尋找可以幫助我很好的提示和最佳實踐的 wordpress 忍者。我真的試圖深入到 WordPress 的深處,但這很難。先謝謝你!
我的插件應該做什麼
該插件的用户應該能夠使用短碼來顯示特定的帖子類型的搜索表單。該插件僅在包含此短代碼的頁面上需要。
帖子類型是通過插件設置頁面創建的。這種類型的每個帖子都有 acf 插件的標題,內容和幾個自定義字段。每個帖子類型都有一個短碼。搜索表單有一個字段來搜索指定的帖子類型的所有後綴字段。另外兩個可以用於通過兩個關鍵字來限制結果 (例如,位置,這是一個 acf 字段) 。
結果通過 ajax 加載,並顯示在搜索表單下方。
我已經做了
我試圖保持這個問題不要太大。所以我沒有指定每一個方面。以下應該正常工作:
-
在插件的 php 文件中創建 post 類型。目前一個靜態的帖子類型是 enaugh 。
-
創建一個打印搜索表單的短代碼,併為結果打印一個空容器。
-
Ajax 請求通過 javascript 工作,並提供預期的結果。
搜索自定義字段
這很難,但是我發現了一個工作的代碼段,我明白了它在做什麼。這裏的問題是,我只想用特定的搜索表單搜索 acf 字段。我不想觸摸現有網站的搜索。
首先,我嘗試檢查用户所在的站點,並在修改搜索查詢之前使用 if-statement 與 is_page() 。但是當我使用 ajax 時,這似乎對我來説不起作用
我的解決方法是在每個 ajax 搜索查詢的開頭設置一個全局變量。現在我在修改搜索查詢之前檢查是否設置了此變量。在我的 ajax 函數結束時,我將此變量設置為 false 。是的,我認為有更好的方法來解決這個問題,但是我不知道如何
修改我的搜索查詢的功能如下:
/**
* Extend WordPress search to include custom fields
*
* http://adambalee.com
*/
/**
* Join posts and postmeta tables
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
*/
function cf_search_join( $join ) {
global $wpdb;
//$cwlistpage=(is_page('list'));
global $testcheck;
$cwlistpage=$testcheck;
if ( $cwlistpage ) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
add_filter('posts_join', 'cf_search_join' );
/**
* Modify the search query with posts_where
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
*/
function cf_search_where( $where ) {
global $pagenow, $wpdb;
//$cwlistpage=(is_page('list'));
global $testcheck;
$cwlistpage=$testcheck;
if ( $cwlistpage ) {
$where = preg_replace(
"/(s*".$wpdb->posts.".post_titles+LIKEs*('[^']+')s*)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
/**
* Prevent duplicates
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
*/
function cf_search_distinct( $where ) {
global $wpdb;
//$cwlistpage=(is_page('list'));
global $testcheck;
$cwlistpage=$testcheck;
if ( $cwlistpage ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
通過自定義字段限制結果
表單的所有字段都是可選的。一個空的表單將返回此帖子類型的所有帖子。第一個字段應該搜索關鍵字的帖子的每個字段。第二個和第三個字段應該將結果限制為包含此關鍵字的結果。我用 if-statements 解決了這個問題,我知道必須有一個更好的解決方案。
/**
* Search with AJAX
*/
function cwlist_click_search() {
global $testcheck;
$testcheck = true;
$searchterm = $_POST['query'];
$searchlocation = $_POST['location'];
$searchdegree = $_POST['degree'];
// WP_Query arguments
$args = array (
'post_type' => 'offers',
'post_status' => 'publish',
's' => $searchterm
);
$query = new WP_Query( $args );
ob_start();
// The Loop
if ( $query->have_posts() ) : ?>
<br><br><p>
<?php while ( $query->have_posts() ) : $query->the_post();
if( ($searchlocation == NULL) || in_array(trim(strtolower($searchlocation)), array_map('strtolower', get_field('offer_location')))):
if( ($searchdegree == NULL) || (trim(strtolower($searchdegree)) === strtolower(get_field('offer_degree')))):?>
Titel: <?php the_title(); ?> <br>
Abschluss: <?php the_field('offer_degree'); ?> <br>
Ort: <?php the_field('offer_location'); ?> <br>
Anbieter: <?php the_field('offer_provider'); ?> <br>
<?php if(get_field('offer_subtitle')): ?>
- <?php the_field('offer_subtitle'); ?> <br>
<?php endif; ?>
<br>
<?php endif; endif; endwhile; ?>
</p>
<?php else: ?>
<!-- no posts found -->
Keine Angebote gefunden
<?php endif;
// Restore original Post Data
wp_reset_postdata();
$content = ob_get_clean();
echo $content;
die();
$testcheck = false;
}
add_action( 'wp_ajax_nopriv_cwlist_click_search', 'cwlist_click_search' );
add_action( 'wp_ajax_cwlist_click_search', 'cwlist_click_search' );
WP 調試
當我激活插件時,許多行如下所示出現在首頁:
Notice: Trying to get property of non-object in C:UsersCWaltDocumentsgitlabsteuerazubiwordpresswp-includesquery.php on line 4520 Notice: Trying to get property of non-object in C:UsersCWaltDocumentsgitlabsteuerazubiwordpresswp-includesquery.php on line 4522 Notice: Trying to get property of non-object in C:UsersCWaltDocumentsgitlabsteuerazubiwordpresswp-includesquery.php on line 4524 …
我激活調試來創建一個好的插件。我可能做錯了什麼?
更多帖子類型
你知道一個好的方法讓用户通過 wordpress 後端指定更多的帖子類型嗎?用户應該能夠通過短碼為不同的郵件類型創建不同的搜索頁面。
非常感謝您的閲讀。我感謝每一個小小的提示。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。