2017-12-15 6 views
0

저자에 대한 맞춤 분류가 있습니다. 알파벳 글자로 색인을 작성해야합니다. 사용자가 문자를 클릭하면 색인 아래에 목록이 나타납니다. 모든 저자의 성이 그 문자로 시작됩니다. 나는 문자가 용어 내 어디에서나 발견 된 모든 용어를 나열한다는 점을 제외하고는 모든 것이 잘 작동합니다. 첫 글자 :"term_clauses"후크를 사용하여 쿼리를 필터링 한 후에도 "name_like"를 사용하여 첫 번째 문자로 사용자 정의 분류 용어를 나열하지 않습니다.

<?php global $product; 

$name_like = isset($_GET['character']) ? $_GET['character'] : ''; 
$letters = range('A', 'Z'); 
$term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy')); 
    $slug = $term->slug; 
?> 

<div id="content-small"> 
    <div class="list-terms"> 

     <div class="alphanav"> 
      <?php foreach ($letters as $letter): ?> 
       <?php if (strtoupper($name_like) == strtoupper($letter)):?> 
        <a class='selected' href="<?php bloginfo('url'); ?>/auteurs/<?php echo $slug ?>?character=<?php echo strtoupper($letter)?>"><?php echo strtoupper($letter)?></a> 
       <?php else: ?> 
        <a href="<?php bloginfo('url'); ?>/auteurs/<?php echo $slug ?>?character=<?php echo strtoupper($letter)?>"><?php echo strtoupper($letter)?></a> 
       <?php endif;?> 
      <?php endforeach;?> 
      <a class="selected set-height" href="<?php bloginfo('url'); ?>/auteurs/<?php echo $slug ?>?character=#">#</a> 
     </div> 
<?php 

$taxonomy = 'auteurs'; 
$queried_term = get_query_var($taxonomy); 
$args = array(
'name__like' => $name_like, 
    'orderby' => 'name', 
    'order' => 'ASC', 
    ); 

$terms = get_terms($taxonomy, $args, 'slug='.$queried_term); 

if ($terms) { 
    $count = count($terms); 
      $i=0; 
      $term_list = '<div class="tab-auteur"> 
    <input id="tab-one-auteur" type="checkbox" name="tabs-auteur"> 
          <label for="tab-one-auteur">La Liste</label> 
          <ul class="bio-list tab-content-auteur">'; 
      //echo '<h2 class="term-letter">'. strtoupper($name_like) . '</h2>'; 

foreach($terms as $term) { 
    $names = $term->name; 
    $unwanted_array = array( 'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 
         'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 
         'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 
         'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 
         'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y'); 
$firstname = substr($names, strpos($names, ",") + 1); 
$arr = explode(",", $names, 2); 
$lastname = $arr[0]; 
$lastname = strtr($lastname, $unwanted_array); 
$lastname = strtoupper($lastname); 
$comma = ','; 
$whichname = strpos($names, $comma); 

if ($whichname === false) { 
$full = strtoupper($names); 
} else { 
$full = $lastname . ', ' . $firstname; 
} 

$i++; 
       $term_list .= '<li><a href="'.get_term_link($term->slug, 
$taxonomy).'?character='. $name_like .'">' . $full . '</a></li>'; 
      if ($count != $i) { 
        $term_list .= ''; 
       } 
      else { 
        $term_list .= '</ul></div>'; 
       } 
      } 
      echo $term_list; 

} 
else { 
    echo '<ul class="bio-list">PAS DE AUTEURS</ul>'; 
} 
?> 
</div> 

내가 많이 연구되고 워드 프레스의 최신 버전에서 변경 "name_like"의 행동을 발견이 post의 도움으로 나는이 용어를 사용했다. _clauses 내 functions.php 파일에 쿼리를 필터링하는 후크 :

function llps_filter_term_clauses($clauses) { 
    remove_filter('term_clauses','llps_filter_term_clauses'); 
    $pattern = '|(name LIKE)\'%(.+%)\'|'; 
    $clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']); 
    return $clauses; 
} 

add_filter('terms_clauses','llps_filter_term_clauses'); 

그리고 일 - 내가했던거야 ... 내가 프로젝트에 로그온 한 다음 시간까지. 그것은 더 이상 작동하지 않고 나는 왜 내 인생을 이해할 수 없는가!

답변

0

나는 동일한 문제가있었습니다. 아마 뭔가 최신 WP 버전에서 변경되었습니다. 이에

$pattern = '|(name LIKE)\'%(.+%)\'|'; 

: 나는 4.9.1

의 문제를이 내가 그것을 해결하는 방법을, 나는이를 변경했습니다 내가 그랬어 왜보고 싶다면

$pattern = '|(name LIKE)\'{.*?}(.+{.*?})\'|'; 

, preg_replace 이전과 이후에 임시로 $ 절을 출력 해보는 것이 좋습니다. 난 당신의 코드에서이 같은 뜻 :

{be8aacdf46dd49d9036fd16c13613bf3036378f188b3535c3416ae7d88844d20} 당신의 편지 여기 :

function llps_filter_term_clauses($clauses) { 
    echo '<pre>';print_r($clauses);echo "\n"; 
    remove_filter('term_clauses','llps_filter_term_clauses'); 
    $pattern = '|(name LIKE)\'%(.+%)\'|'; 
    $clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']); 
    print_r($clauses);die(); 
    return $clauses; 
} 

당신은 연산자 LIKE는 SQL의 전형적인 "%"이 같은으로 WP에 의해 변형되는 것을 볼 수 {be8aacdf46dd49d9036fd16c13613bf3036378f1816bb3535c3416ae7d88844d20}

즉, {} 안에있는 문자열이며 그 때문에 필터에서 정규 표현식을 변경했습니다. 희망이 도움이됩니다.

+0

감사합니다. 완벽하게 작동합니다. – hel2695

관련 문제