我有一个名为“rejectedpayments”的自定义帖子类型,我有一个名为“rejpayments-category”的自定义分类法,它已分配给此 CPT。然后我有一个存档模板,它只显示所有分类术语标题(不是实际的帖子),然后我可以单击分类术语标题以查看该分类中的所有帖子。此页面上有一个搜索字段,这就是我正在努力解决的问题。搜索只是按自定义帖子类型搜索,因此它会搜索“rejectedpayments”CPT 中的每个帖子,但我希望它只搜索实际的术语标题。
所以如果我有:
第一学期
第二学期
第三学期
目前,如果我搜索“帖子”,显然有 6 个帖子的标题带有此内容,所以它们出现了(它根本不搜索术语标题),所以标题、第 1 期、第 2 期和第 3 期是我的只想搜索。
表单上唯一的过滤器显然是 CPT 名称,但我不知道如何添加额外的过滤器,因此它也仅添加搜索词名称的参数。
<form role="search" action="<?php echo site_url('/'); ?>" method="get" id="searchform">
<div class="row form-wrap">
<div class="col-md-10 padding-none">
<input type="text" name="s" placeholder="Search all rejected payments"/>
<input type="hidden" name="post_type" value="rejectedpayments" />
</div>
<div class="col-md-2 padding-none">
<input type="submit" alt="Search" value="Search" />
</div>
</div>
</form>
我当前的存档页面仅列出特定自定义帖子类型中的所有术语名称
<?php $wcatTerms = get_terms('rejpayments-category', array('hide_empty' => 0, 'parent' =>0));
foreach($wcatTerms as $wcatTerm) :
?>
<div class="results-table">
<div class="row info-tables">
<div class="col-md-6">
<a href="<?php echo get_term_link( $wcatTerm->slug, $wcatTerm->taxonomy ); ?>"><?php echo $wcatTerm->name; ?></a>
<?php
$wsubargs = array(
'hierarchical' => 1,
'show_option_none' => '',
'hide_empty' => 0,
'parent' => $wcatTerm->term_id,
'taxonomy' => 'rejpayments-category'
);
$wsubcats = get_categories($wsubargs);
foreach ($wsubcats as $wsc):
?>
<p><a href="<?php echo get_term_link( $wsc->slug, $wsc->taxonomy );?>"><?php echo $wsc->name;?></a></p>
<?php
endforeach;
?>
</div>
<div class="col-md-6">
LINK
</div>
</div>
</div>
<?php
endforeach;
?>
以下更新可用于生成所需的搜索结果。
归档页面可以自己提交表单。表格
action
属性可以更改如下:
<form role="search" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get" id="searchform">
<input name="submittedForm" type="submit" alt="Search" value="Search" />
/**
* Untested code.
* You may wish to change the ORDER BY clause.
*
* @param string $searchKey Search key submitted from the search form.
*
* @return object[] $wcatTerms Array of taxonomy term objects.
*/
function get_filtered_taxonomy_terms( $searchKey ) {
global $wpdb;
$custom_taxonomy = 'CUSTOM_TAXONOMY_NAME';
$table_prefix = $wpdb->prefix;
$sql = "";
$sql .= "SELECT T.term_id, T.slug, T.name, TT.term_taxonomy_id, TT.description, TT.parent, TT.count";
$sql .= " FROM {$table_prefix}terms T";
$sql .= " JOIN {$table_prefix}term_taxonomy TT ON ( TT.term_id = T.term_id )";
$sql .= " WHERE TT.taxonomy = %s";
$sql .= " AND T.name LIKE %s";
$sql .= " ORDER BY T.name ASC";
$sql .= ";";
$prepared_sql = $wpdb->prepare(
$sql,
$custom_taxonomy,
'%' . $wpdb->esc_like( $searchKey ) . '%'
);
$wcatTerms = $wpdb->get_results( $prepared_sql, 'OBJECT' );
return $wcatTerms;
}
if ( isset( $_GET ) && isset( $_GET['submittedForm'] ) ) {
// Search form submitted.
// Find associative array of all terms (parents and children)
// with term name partially matching the search key.
$wcatTerms = get_filtered_taxonomy_terms( $_GET['s'] );
...
} else {
// Default terms list.
$wcatTerms = get_terms('rejpayments-category', array('hide_empty' => 0, 'parent' =>0));
...
}
使用分层术语,可以根据最大深度等使用不同的方法来呈现列表。可以扩展 WordPress Walker 类 并用于呈现列表。这种扩展的一个例子是 WordPress Walker_Nav_Menu 类.