В WordPress я сейчас использую SEO-плагин Yoast для отображения панировочные сухари для моих страниц и сообщений, что хорошо работает при посещении определенной страницы.
Вот функция, которую я использую для отображения хлебных крошек внутри моих шаблонов WordPress:
<?php if ( function_exists('yoast_breadcrumb') ) {
yoast_breadcrumb('<p id="breadcrumbs">','</p>');
} ?>
Например, при просмотре Team Members
который является ребенком About Us
Я получил:
Home > About Us > Team Members
Однако я хотел бы иметь возможность отображать те же хлебные крошки (для отдельных страниц и сообщений) в цикле результатов поиска.
Пока что отображается при поиске Members
является:
Результаты вашего поиска:
Team Members Home > Search > Members Members Area Home > Search > Members
Но я не хочу панировочных сухарей для страницы результатов поиска, я хочу их для отдельных страниц и постов, которые отображаются в результате поиска по ключевому слову.
Например, представьте, что я снова искал Members
Я хотел бы отобразить ниже:
Результаты вашего поиска:
Team Members Home > About Us > Team Members Members Area Home > Members Area
Я не смущаюсь, интегрирован ли он или нет с плагином SEO, однако пока что это лучшее решение, которое я нашел для отображения хлебных крошек в WordPress!
Кроме того, если это требуется, вот мой search.php
файл: http://pastebin.com/0qjb2954
Попробуй это. Это мой собственный рабочий фрагмент, который показывает крошки внутри цикла поиска.
/*Begin Loop */
<?php
echo '<div class="b-search_result_list__item_breadcrumbs breadcrumbs">';
$current_type = get_post_type();
if ($current_type == 'page') {
$parents = get_post_ancestors(get_the_ID());
if($parents){
for($i=count($parents)-1;$i>=0;$i--){
echo '<span typeof="v:Breadcrumb">';
echo '<a rel="v:url" property="v:title" title="'.get_the_title($parents[$i]).'" href="'.get_permalink($parents[$i]).'">'.get_the_title($parents[$i]).'</a>';
echo '</span>';
}
}else{
echo '<span typeof="v:Breadcrumb">';
echo '<a rel="v:url" property="v:title" title="'.get_bloginfo('name').'" href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a>';
echo '</span>';
}
echo '<span typeof="v:Breadcrumb">';
echo '<span property="v:title">'.get_the_title().'</span>';
echo '</span>';
}else{
$current_obj = get_post_type_object($current_type);
echo '<span typeof="v:Breadcrumb">';
echo '<a rel="v:url" property="v:title" title="'.get_bloginfo('name').'" href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a>';
echo '</span>';
echo '<span typeof="v:Breadcrumb">';
echo '<a rel="v:url" property="v:title" title="'.$current_obj->labels->name.'" href="'.get_post_type_archive_link( $current_type ).'">'.$current_obj->labels->name.'</a>';
echo '</span>';
$current_taxonomies = get_object_taxonomies($current_type);
if($current_taxonomies){
$current_terms = get_the_terms(get_the_ID(), $current_taxonomies[0]);
if($current_terms){
$current_term = array_shift($current_terms);
echo '<span typeof="v:Breadcrumb">';
echo '<a rel="v:url" property="v:title" title="'.$current_term->name.'" href="'.get_term_link($current_term).'">'.$current_term->name.'</a>';
echo '</span>';
/*
var_dump($current_obj->labels->name); // Archive name
var_dump(get_post_type_archive_link( $current_type )); // Archive link
var_dump($current_term->name); // Term name
var_dump(get_term_link($current_term)); // Term link
var_dump(get_permalink()); // Post link
*/
}
}
echo '<span typeof="v:Breadcrumb">';
echo '<span property="v:title">'.get_the_title().'</span>';
echo '</span>';
}
echo '</div>';
?>
/*End Loop*/
Использование плагина для генерации панировочных сухарей не является действительно необходимым. Вот простая функция PHP, которую вы можете добавить в свой файл functions.php:
function breadcrumbs() {
global $post;
echo "<ul id='breadcrumbs'>";
if (!is_home()) {
echo '<li><a href="' . get_option('home') . '">Home</a></li>';
if (is_category() || is_single()) {
echo "<li>" . the_category(' </li><li> ');
if (is_single()) {
echo "</li><li>" . the_title() . "</li>";
}
} elseif (is_page()) {
if($post->post_parent){
foreach ( get_post_ancestors( $post->ID ) as $ancestor ) {
echo '<li><a href="' . get_permalink($ancestor) . '" title="' . get_the_title($ancestor) . '">' . get_the_title($ancestor) . '</a></li>' . get_the_title();
}
} else {
echo "<li>" . get_the_title() . "</li>";
}
}
} elseif (is_tag()) {
single_tag_title();
} elseif (is_day()) {
echo "<li>Archive for " . the_time('F jS, Y') . "</li>";
} elseif (is_month()) {
echo "<li>Archive for " . the_time('F, Y') . "</li>";
} elseif (is_year()) {
echo "<li>Archive for " . the_time('Y') . "</li>";
} elseif (is_author()) {
echo "<li>Author Archive</li>";
} elseif (isset($_GET['paged']) && !empty($_GET['paged'])) {
echo "<li>Blog Archives</li>";
} elseif (is_search()) {
echo "<li>Search Results for" . the_search_query() . "</li>";
}
echo "</ul>";
}
наряду с некоторыми CSS-стилями, настройте его по своему желанию
#breadcrumbs {
list-style:none;
margin:5px 0;
overflow:hidden;
}
#breadcrumbs li{
float:left;
}
#breadcrumbs li+li:before {
content: '| ';
padding:0 4px;
}
Затем вы можете реализовать эти хлебные крошки на любой странице, которая вам нравится, включая ваш файл searchpage.php или любой другой файл, который вы используете для отображения результатов поиска с помощью этого вызова.
<?php breadcrumbs(); ?>
попробуйте добавить эту строку кода над функцией yoast breadcrumb в вашем файле search.php:
WPSEO_Breadcrumbs::$instance = NULL;
Я думаю, это будет строка 22, а также убедитесь, что вы используете функцию Yoast breadcrumb из вашего вопроса, а не новую функцию breadcrumb (), которая есть сейчас.
Пожалуйста, дайте мне знать, если это работает!
Полное объяснение:
Функциональность хлебных крошек плагина Yoast основана на загрузке страницы, основываясь на текущей странице как дочерней. Чтобы загрузить нужного ребенка и родителей, вам нужно сбросить его, прежде чем запускать функцию. Нет встроенной функции сброса, однако установка статического $ instance в NULL должна заставить плагин заново генерировать свои данные на основе текущего глобального объекта post, который устанавливается во время зацикливания.
Опираясь на ответ Явора, я нашел способ. Уже несколько часов бьюсь головой об этом. Вы можете разместить резервную копию и восстановить отусидную петлю. Вот:
global $wp_query;
//backup
$old_singular_value = $wp_query->is_singular;
//change
$wp_query->is_singular = true;
//reset
WPSEO_Breadcrumbs::$instance = NULL;
//breadcrumbs
if (function_exists('yoast_breadcrumb')){
yoast_breadcrumb('<p id="breadcrumbs">','</p>');
}
//restore
$wp_query->is_singular = $old_singular_value;
Он подделывает запрос, чтобы сделать его единичным, поэтому недавно обновленные панировочные сухари считают, что это не страница поиска, а отдельный пост или страница или все, что вы отображаете в качестве результатов поиска.
Страницы поиска имеют условная функция это можно использовать. Вы всегда можете применить это для загрузки панировочных сухарей. Вот пример:
if ( ! is_search() ) {
if ( function_exists('yoast_breadcrumb') ) {
yoast_breadcrumb('<p id="breadcrumbs">','</p>');
}
}
Это также зависит от того, где вы загружаете панировочные сухари, но обычно это должно работать, если ваша тема не очень уникальна.