私はPHP初心者で、この関数を書きました。それは、その文字と現在フィルタリングされている「一般」分類学用語の両方に投稿がある文字だけを示すアルファベット順のナビゲーションです。
私は、たとえば "rock"と "funk"の両方としてタグ付けされている "artistas"投稿を見つけるために、複数の分類法クエリを使用します。
この関数は完璧に機能し、私が望むものを正確に出力しますが...
複数のループは実際にロード時間を遅らせています、そして私がそうであるn00bであるので、機能をどのように最適化するべきかについて不確実です。
どんなポインタやガイダンスもVERY高く評価されるでしょう。あなたが欲しいなら私は時間を交換することができます(私はいくつかの意味CSSを書きます):)
ありがとうございました!
<?php
function bam_artist_alfa() {
$taxonomy = 'alfa';
$uri = my_url();
$home = 'http://buenosairesmusic.com/';
// save the terms that have posts in an array as a transient
if ( false === ( $alphabet = get_transient( 'bam_archive_alphabet' ) ) ) {
// It wasn't there, so regenerate the data and save the transient
$terms = get_terms($taxonomy);
$alphabet = array();
if($terms){
foreach ($terms as $term){
$alphabet[] = $term->slug;
}
}
set_transient( 'bam_archive_alphabet', $alphabet );
}
if(strstr($uri, '/artista/') ) {
$uri = str_replace('/artista/','/?alfa=', $uri);
$uri = substr_replace($uri ,"",-1);
}
$all_link = removeqsvar($uri, 'alfa');
$last = $all_link[strlen($all_link)-1];
if($last == '?') $all_link = substr_replace($all_link ,"",-1);
if($all_link == $home)
$all_link = $home.'artistas';
if( isset($_GET) && isset($_GET['alfa']) ) {
$is_alfa = (!is_tax('alfa') && !$_GET['alfa'] ? false : true );
} else {
$is_alfa = (!is_tax('alfa') ? false : true );
}
$all_current = ($is_alfa == true ? null : ' bg1 round-res' );
?>
<ul class="bbw bo alfa-nav c2">
<li class="all-link<?php echo $all_current; ?>">
<?php if(!$is_alfa) { echo 'A–Z'; } else { ?>
<a href="<?php echo $all_link; ?>">A–Z</a>
<?php }?>
</li>
<?php
$query = $_SERVER['QUERY_STRING'];
$genre = null;
$orden = (isset($_GET) && isset($_GET['orden']) ? '&orden=fecha' : null);
if( strstr($uri,'/genero/') ) {
$genre = str_replace('/genero/','/?genero=', $uri);
$genre = substr_replace($uri ,"",-1);
$genre = explode('/',$genre);
$genre = end($genre);
} elseif( isset($_GET) && isset($_GET['genero']) ) {
$genre = $_GET['genero'];
}
if(!empty($genre)) {
$spaces = strpos($genre,' ');
$genre = ($spaces === false ? $genre : explode(' ', $genre) );
}
function has_artists($i, $genre) {
if(empty($genre)) {
$termquery['tax_query'] = array(
array(
'taxonomy' => 'alfa',
'terms' => $i,
'field' => 'slug',
),
);
$termquery['post_type'] = 'artistas';
} else {
$alfaquery[] = array(
'taxonomy' => 'alfa',
'terms' => $i,
'field' => 'slug',
);
if(is_array($genre)) {
$genres[] = array(
'taxonomy' => 'genero',
'terms' => $genre,
'field' => 'slug',
'operator' => 'AND'
);
} else {
$genres[] = array(
'taxonomy' => 'genero',
'terms' => $genre,
'field' => 'slug',
);
}
$termquery['tax_query'] = array_merge($genres, $alfaquery);
$termquery['tax_query']['relation'] = "AND";
$termquery['post_type'] = 'artistas';
}
$has_artists = get_posts($termquery);
if($has_artists) {
return true;
} else {
return false;
}
}
foreach(range('a', 'z') as $i) :
$current = ($i == get_query_var($taxonomy)) ? "bg1 round-res" : "menu-item";
if(empty($genre)) {
$link = $home.'?alfa='.$i.$orden;
} else {
$genrestring = (is_array($genre) ? implode('+',$genre) : $genrestring = $genre );
$link = $home.'?alfa='.$i.'&genero='.$genrestring.$orden;
}
if ( has_artists($i,$genre) && $i != get_query_var($taxonomy) ){
?>
<li class="<?php echo $current; ?>">
<?php printf('<a href="%s">%s</a>', $link, strtoupper($i) ) ?>
</li>
<?php } else { ?>
<li class="<?php echo $current; if($i != get_query_var($taxonomy)) {echo ' empty';} ?>">
<?php echo strtoupper($i); ?>
</li>
<?php
}
endforeach;
?>
</ul>
<?php } ?>
私はただ投稿を持っているアルファベット/分類学用語の配列を検索するでしょう。あなたはこれをしますが、実際には使いません。この関数は空でない(アルファベット)用語の配列を返します。
(一時的な? - この分類法を使用して複数の投稿タイプがある場合を除き、(下記を参照) mがトランジェントの使用から得られるものであるかどうかはわかりません - そしてget_terms
を呼び出してwp_list_pluck
を使用することができます)。次の関数はトランジェントを使用します。
wpse50148_get_used_alpha(){
if ( false === ( $alphabet = get_transient( 'bam_archive_alphabet' ) ) ) {
//It wasn't there, so regenerate the data and save the transient
$terms = get_terms('alfa');
$alphabet =array();
if($terms){
$alphabet = wp_list_pluck($terms,'slug');
}
set_transient( 'bam_archive_alphabet', $alphabet );
}
return $alphabet;
}
投稿が更新されたときにトランジェントを更新することを忘れないでください。
この方法では、この分類法を使用する唯一の投稿タイプが 'artistas'であると仮定しています。
これを回避するには、投稿にクエリを実行し、投稿をループして用語を収集する必要があります。どちらの方法でも - 'used'アルファベットを取得するために実行されているのは、26個ではなく1個だけです。このシナリオでは、一時的なもののほうが明らかに時間を節約できます。
$alphabet = wpse50148_get_used_alpha();
foreach(range('a', 'z') as $i) :
if( in_array($i,$alphabet) ){
//Letter has terms
}else{
//Letter does not have terms
}
endif;
トランジェントAPIはまだ使用していませんが、この場合は良い選択だと思います。あなたはそれを使用しますが、データのごく一部にのみ使用します。
アルファやジャンルごとにアーティストをキャッシュするには、次のようにします(私は思います)。
if ( false === ( $has_artists = get_transient( "bam_artist_$i_$genre" ) ) ) {
$has_artists = get_posts($termquery);
set_transient( "bam_artist_$i_$genre", $has_artists );
}