我正在试图了解修改搜索结果显示方式的最佳方法。我已经让搜索功能正常工作并给出正确的结果,现在我正在修改搜索结果页面上显示的每个帖子的内容。更具体地说,我想显示每个帖子的自定义元信息。
我在插件文件中创建了一个自定义帖子类型,在该文件的末尾是以下代码,用于为该自定义帖子类型创建更高级的搜索设置。
function rtu_pre_get_posts( $query ) {
if ( is_admin() || ! $query->is_main_query() ){
return;
}
if ( !is_post_type_archive( \'classifieds\' ) ){
return;
}
$meta_query = array();
if( count( $meta_query ) > 1 ){
$meta_query[\'relation\'] = \'AND\';
}
if( count( $meta_query ) > 0 ){
$query->set( \'meta_query\', $meta_query );
}
}
add_action( \'pre_get_posts\', \'rtu_pre_get_posts\', 1 );
function rtu_search_form( $args ){
// The Query
// meta_query expects nested arrays, even if you only have one query
// to add the category param
$rtu_query = new WP_Query( array( \'post_type\' => \'classifieds\', \'posts_per_page\' => \'-1\' ) );
// The Loop
if ( $rtu_query->have_posts() ) {
while ( $rtu_query->have_posts() ) {
$rtu_query->the_post();
}
}
/* Restore original Post Data */
wp_reset_postdata();
// Set up the type radio buttons
$args = array( \'hide_empty\' => false );
$type_terms = get_terms( \'type\', $args );
if( is_array( $type_terms ) ){
$select_type .= \'<input type="radio" name="producttype" value="" selected="selected">\' . __( \'All\', \'classifieds_plugin\' ) . \'</br>\';
foreach ( $type_terms as $term ) {
$select_type .= \'<input type="radio" name="producttype" value="\' . $term->slug . \'">\' . $term->name . \'</br>\';
}
}
// Set up the location dropdown list
$args = array( \'hide_empty\' => false );
$location_terms = get_terms( \'location\', $args );
if( is_array( $location_terms ) ){
$select_location = \'<select name="location">\';
$select_location .= \'<option value="" selected="selected">\' . __( \'Select location\', \'classifieds_plugin\' ) . \'</option>\';
foreach ( $location_terms as $term ) {
$select_location .= \'<option value="\' . $term->slug . \'">\' . $term->name . \'</option>\';
}
$select_location .= \'</select>\' . "\\n";
}
// Set up the brand dropdown list
$args = array( \'hide_empty\' => false );
$brand_terms = get_terms( \'brand\', $args );
if( is_array( $brand_terms ) ){
$select_brand = \'<select name="brand">\';
$select_brand .= \'<option value="" selected="selected">\' . __( \'Select brand\', \'classifieds_plugin\' ) . \'</option>\';
foreach ( $brand_terms as $term ) {
$select_brand .= \'<option value="\' . $term->slug . \'">\' . $term->name . \'</option>\';
}
$select_brand .= \'</select>\' . "\\n";
}
// Set up the class dropdown list
$args = array( \'hide_empty\' => false );
$class_terms = get_terms( \'class\', $args );
if( is_array( $class_terms ) ){
$select_class = \'<select name="class">\';
$select_class .= \'<option value="" selected="selected">\' . __( \'Select class\', \'classifieds_plugin\' ) . \'</option>\';
foreach ( $class_terms as $term ) {
$select_class .= \'<option value="\' . $term->slug . \'">\' . $term->name . \'</option>\';
}
$select_class .= \'</select>\' . "\\n";
}
// Set up the power dropdown list
$args = array( \'hide_empty\' => false );
$power_terms = get_terms( \'power\', $args );
if( is_array( $power_terms ) ){
$select_power = \'<select name="power">\';
$select_power .= \'<option value="" selected="selected">\' . __( \'Select power\', \'classifieds_plugin\' ) . \'</option>\';
foreach ( $power_terms as $term ) {
$select_power .= \'<option value="\' . $term->slug . \'">\' . $term->name . \'</option>\';
}
$select_power .= \'</select>\' . "\\n";
}
$output = \'<form id="rtuform" action="\' . esc_url( home_url() ) . \'" method="GET" role="search">\';
$output .= \'<div class="rtutextfield">\' . \'<input type="text" name="s" placeholder="Search by keyword..." value="\' . get_search_query() . \'" /></div>\';
$output .= \'<div class="rtuselectbox">\' . $select_type . \'</div>\';
$output .= \'<div class="rtuselectbox">\' . $select_location . \'</div>\';
$output .= \'<div class="rtuselectbox">\' . $select_brand . \'</div>\';
$output .= \'<div class="rtuselectbox">\' . $select_class . \'</div>\';
$output .= \'<div class="rtuselectbox">\' . $select_power . \'</div>\';
$output .= \'<input type="hidden" name="post_type" value="classifieds" />\';
$output .= \'<p><input type="submit" value="Search" class="button" /></p></form>\';
return $output;
}
我已经把它全部包括在这里,以防它的其他部分很重要,但我相信这是我需要处理的部分:
// The Loop
if ( $rtu_query->have_posts() ) {
while ( $rtu_query->have_posts() ) {
$rtu_query->the_post();
}
}
然而,我不知道该怎么做,因为当我尝试添加一些内容时,就像这样:
// The Loop
if ( $rtu_query->have_posts() ) {
while ( $rtu_query->have_posts() ) {
$rtu_query->the_post();
?>
<p>Some extra content...</p>
<?php
}
}
我添加的内容会显示在自定义搜索框上方的侧栏中,而不是显示在每篇文章中。这整段代码是我从网上的一篇文章中摘取的,是为了满足我的需要而编写的,所以我在这里有点不知所措,试图尽我所能解决问题。
更新时间:
这是我的search-classifieds.php
“我的孩子”主题中的文件。(这是基于genesis框架构建的儿童主题。)
<?php
/**
* Custom search template
*/
// Force full-width-content layout setting
add_filter( \'genesis_pre_get_option_site_layout\', \'__genesis_return_sidebar_content\' );
//remove the default genesis sidebar
remove_action( \'genesis_sidebar\', \'genesis_do_sidebar\' );
// Display custom search section
add_action( \'genesis_sidebar\', \'display_search\' );
function display_search() {
echo rtu_search_form($args);
}
get_search_query();
genesis();
我专门为这种自定义帖子类型制作了这个自定义搜索模板。在我的孩子主题中
functions.php
文件我正在使用以下函数强制主题将此自定义搜索模板用于我的自定义帖子类型:
function template_chooser($template)
{
global $wp_query;
$post_type = get_query_var(\'post_type\');
if( $wp_query->is_search && $post_type == \'classifieds\' )
{
return locate_template(\'search-classifieds.php\'); // redirect to archive-search.php
}
return $template;
}
add_filter(\'template_include\', \'template_chooser\');
我从Smashing杂志的一篇文章中获得了这个插件。您可以在此处查看原始插件:
https://gist.github.com/carlodaniele/fd5847f4baf42ca84771273ce21771fd
这里还有一个指向原文的链接。我对原来的插件做了一些更改,主要是删除了我不需要的元框,并添加了一些我需要的元框。
最合适的回答,由SO网友:Tom J Nowell 整理而成
不使用the_post
, 而是使用the_content
用于修改传递给的内容的筛选器the_content()
呼叫
然而,这是你的主题,所以最好的方法就是在search.php
, 而且不用担心过滤器和操作。也就是说,不要在过滤器上运行代码来尝试修改或拦截模板正在执行的操作,只需直接在模板中执行即可。
E、 g.如果这是我的search.php
:
<?php
while( have_posts() ) {
the_post();
the_title();
the_content();
}
我想用Lorem ipsum替换内容,我可以这样做:
<?php
while( have_posts() ) {
the_post();
the_title();
?>
<p>Lorem Ipsum Dolors sit atem etc....</p>
<?php
}
或者,如果我想在搜索结果中的每个标题后添加一个关于小马的PNG广告:
<?php
while( have_posts() ) {
the_post();
the_title();
toms_pony_advert();
the_content();
}
其中函数
toms_pony_advert()
输出所述广告。
我想你可能会被WordPress的一些神奇的方法所困扰,这种方法可以在不修改主题模板的情况下修改主题模板,但正确的方法是直接修改文件。毕竟这是你的代码。它不是使用某种过滤器、操作或API。你无法通过搜索找到它的原因是因为它不是WordPress知识,而是基本的编程知识,特别是PHP基础知识。
如果它不是您的代码,那么创建一个子主题并以这种方式进行。如果是WP核心,不,永远不要这样做,使用操作和过滤器。如果是别人的插件使用动作和过滤器,如果没有,很难,你必须请求添加它们或派生插件
如果您试图从插件中执行此操作,而另一方面它对所有主题都有效,那么这将是一个完全不同的问题,并且没有合适的解决方案。但你不是那种情况。