问题描述
搜索大约两天来找到我的问题的答案,我终于注册了这个 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。