我的问题是: 我有 3个自定义分类,让我们说'作者','标题'和'编辑',每个都适用于常规帖子。 假设我在'作者'字段'jorge borges'中有post_1,而post_2有'ray bradbury'。
我正在尝试使用包含三个分类法和文本字段的下拉菜单的搜索表单,这样如果我选择,即“作者”并搜索“jorge borges” ',结果将是post_1。
另外两种分类法也应该像这样工作。
我找不到类似的东西,因为很多问题涉及创建一个包含所有分类实例的下拉菜单,这不是我想要的。 我想要一个带有分类法类别的下拉菜单,而不是值。
答案 0 :(得分:0)
好的,这是我在我的网站上提出并测试的内容。
请注意,这是非常原始的(即没有造型),你可能需要为它添加一些弹性以防万一你得到一些意想不到的结果,但这完全取决于你我害怕。
这是搜索表单。我没有添加action
,因为我不知道您要将表单重定向到哪里。但是,默认情况下,您将被定向回同一页面,因此您只需查询那里的帖子。
<form method="POST">
<h3>Search for posts</h3>
<?php
$taxonomies[] = get_taxonomy('author');
$taxonomies[] = get_taxonomy('title');
$taxonomies[] = get_taxonomy('editor');
$options = array();
if(!empty($taxonomies)) : foreach($taxonomies as $taxonomy) :
if(empty($taxonomy)) : continue; endif;
$options[] = sprintf("\t".'<option value="%1$s">%2$s</option>', $taxonomy->name, $taxonomy->labels->name);
endforeach;
endif;
if(!empty($options)) :
echo sprintf('<select name="search-taxonomy" id="search-taxonomy">'."\n".'$1%s'."\n".'</select>', join("\n", $options));
echo '<input type="text" name="search-text" id="search-text" value=""></input>';
echo '<input type="button" name="search" id="search" value="Search"></input>';
endif;
?>
</form>
现在,在输出帖子之前添加它 -
if(!empty($_POST['search-text'])) :
$args = get_search_args();
query_post($args);
endif;
最后,将此添加到您的function.php
,以便您可以抓住相关的$args
function get_search_args(){
/** First grab all of the Terms from the selected taxonomy */
$terms = get_terms($_POST['search-taxonomy'], $args);
$needle = $_POST['search-text'];
/** Now get the ID of any terms that match the text search */
if(!empty($terms)) : foreach($terms as $term) :
if(strpos($term->name, $needle) !== false || strpos($term->slug, $needle) !== false) :
$term_ids[] = $term->term_id;
endif;
endforeach;
endif;
/** Construct the args to use for quering the posts */
$args = array(
'order' => ASC,
'orderby' => 'name',
'post_status' => 'publish',
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => $_POST['search-taxonomy'],
'field' => 'term_id',
'terms' => $term_ids,
'operator' => 'IN'
)
)
);
return $args();
}