2014-10-10 10 views
5

In WordPress attualmente sto usando Yoast's SEO Plugin per visualizzare breadcrumbs per le mie pagine e post, che funziona bene quando si visita una pagina specifica.WordPress breadcrumb nei risultati di ricerca

Qui è la funzione che sto utilizzando per visualizzare il pangrattato all'interno dei miei modelli di WordPress:

<?php if (function_exists('yoast_breadcrumb')) { 
    yoast_breadcrumb('<p id="breadcrumbs">','</p>'); 
} ?> 

Per esempio durante la navigazione a Team Members che è un figlio di About Us ottengo:

Home > About Us > Team Members 

Tuttavia mi piacerebbe poter visualizzare gli stessi breadcrumb (per le singole pagine e post) all'interno del ciclo dei risultati di ricerca.

Finora ciò che viene visualizzato quando si cerca Members è:

Risultati della ricerca:

Team Members 
Home > Search > Members 

Members Area 
Home > Search > Members 

Ma io non voglio briciole di pane per la pagina dei risultati della ricerca, che loro vogliono per le singole pagine e i post visualizzati come risultato della ricerca di una parola chiave.

Per esempio Immaginate ho cercato ancora per Members vorrei visualizzato qui sotto:

Risultati della ricerca:

Team Members 
Home > About Us > Team Members 

Members Area 
Home > Members Area 

non sto coccolato se questo è o non è integrato con il plugin SEO, tuttavia finora è la soluzione migliore che ho trovato per visualizzare breadcrumb in WordPress!

richiede anche in caso abody esso, qui è la mia search.php di file: http://pastebin.com/0qjb2954

risposta

1

Utilizzando un plugin per generare briciole di pane non è realmente necessario. Ecco una semplice funzione PHP è possibile aggiungere al file 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>"; 
} 

insieme ad alcuni CSS per lo stile che, come si desidera personalizzare

#breadcrumbs { 
    list-style:none; 
    margin:5px 0; 
    overflow:hidden; 
} 

#breadcrumbs li{ 
    float:left; 
} 
#breadcrumbs li+li:before { 
    content: '| '; 
    padding:0 4px; 
} 

È possibile quindi implementare quelle briciole di pane in qualsiasi pagina ti piace, tra cui il file searchpage.php o qualsiasi file che si utilizza per visualizzare risultati di ricerca con questa chiamata

<?php breadcrumbs(); ?> 
+1

scusate, ho appena trovato un paio di errori di sintassi, ma ora dovrebbe andare tutto bene. non ho toccato php in un paio di settimane quindi fammi sapere come va, dovrebbe funzionare bene però. – davidcondrey

+0

è tardi cosa posso dire .. lol – davidcondrey

+0

inserisci il codice dai risultati di ricerca php file – davidcondrey

0

prova ad aggiungere questa riga di codice sopra la funzione I Yoast breadcrumb n il file search.php:

WPSEO_Breadcrumbs::$instance = NULL; 

Questo sarebbe linea 22 credo, e anche fare in modo di utilizzare la funzione di breadcrumb Yoast dalla tua domanda, non la funzione nuova breadcrumb() che è lì adesso.

Per favore fatemi sapere se funziona!

spiegazione completa:

La funzionalità del plugin di pangrattato Yoast è sfruttare il caricamento della pagina, sulla base della pagina corrente come il bambino. Per farlo caricare il bambino e i genitori giusti, è necessario ripristinarlo prima di eseguire la funzione. Non esiste una funzione di reimpostazione integrata, tuttavia l'impostazione dell'istanza $ statica su NULL dovrebbe far rigenerare i relativi plug-in al plug-in in base all'oggetto postale globale corrente impostato durante il ciclo.

+0

@Giles hai provato questo? – Yavor

+1

Sembra che questo sia impossibile. Anche dopo aver reimpostato l'istanza, il plugin utilizza is_singular() per determinare se la pagina corrente è o meno un post e questa funzione non può essere sovrascritta. Quindi, anche se sta caricando il post giusto dopo aver resettato l'istanza, sta selezionando il tipo sbagliato di breadcrumb da visualizzare in base al tipo della pagina corrente (post/archivio/categoria/ecc.) – Yavor

0

Le pagine di ricerca hanno un conditional function che può essere utilizzato. Puoi sempre applicarlo al caricamento del breadcrumb. Ecco un esempio:

if (! is_search()) { 
    if (function_exists('yoast_breadcrumb')) { 
     yoast_breadcrumb('<p id="breadcrumbs">','</p>'); 
    } 
} 

Dipende da dove si sta caricando il pangrattato pure, ma questo dovrebbe in genere funziona a meno che il tema è molto singolare.

2

Prova questo. Questo è il mio frammento di lavoro che mostra i breadcrumb all'interno del ciclo di ricerca.

/*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*/ 
0

Basandosi sulla risposta di Yavor, ho trovato un modo. Ho battuto la testa per ore. Puoi però posizionare il backup e ripristinare l'otuside del ciclo. Eccolo:

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; 

Si finge la query per renderla singolare modo il pane grattugiato appena rinfrescati pensa che questa non è la pagina di ricerca, ma un singolo post o una pagina o qualsiasi altra cosa si sta visualizzando come i risultati della ricerca.