2013-05-07 8 views
8

Mam niestandardowy typ postu "staff". Muszę to zrobić, aby wyświetlić alfabetycznie personel według nazwiska na stronie. Wiem, że obejście byłoby używanie niestandardowych meta-boxów i rozbijanie imion i nazwisk na dwa pola, ale staram się tego uniknąć, ponieważ wydaje się to bardzo hackowe i nie tak czyste, jak tylko użycie pola tytułu.WordPress Order by Last Word In Title

Mam działającą funkcję shortcode, która wyświetli niestandardowy typ wpisu z żądanym atrybutem taksonomii "type" staff. Oto przykład:

[staff type="local"] 

Nie mogę tylko przypuszczać, że to drugie słowo w tytule, że chcę, ponieważ niektórzy pracownicy są pary i będzie miał zarówno ich nazwisk na liście, takie jak: „Bob i Cindy Smith” .

Oto krótki kod, który mam do tej pory.

function get_staff($atts) { 
    extract(shortcode_atts(array('type' => 'international'), $atts)); 
    $loop = new WP_Query(
     array (
      'post_type' => 'staff', 
      'orderby' => 'title', 
      'staff-type' => $type 
     ) 
    ); 

if ($loop->have_posts()) { 
    $output = '<div class="staff">'; 

    while($loop->have_posts()){ 
     $loop->the_post(); 
     $meta = get_post_meta(get_the_id()); 

     $output .= ' 
      <div class="staff" style="float: left; display: block; border: 1px solid #CCC; margin: 10px; padding: 12px; background-color: #eee;"> 
       <a href="' . get_permalink() . '"> 
        ' . get_the_post_thumbnail($post->ID, 'thumbnail') . '<br /> 
       ' . get_the_title() . '</a><br /> 
       ' . get_the_excerpt() . ' 
      </div> 
     '; 
    } 
    $output .= "</div>"; 
} else { 
    $output = 'No Staff Meet This Criteria Yet.'; 
} 

return $output; 
}; 

add_shortcode('staff', 'get_staff'); 

Działa to świetnie, ale brakuje alfabetycznego według nazwiska. Dziękuję za pomoc, którą możesz zaoferować. To jest moja pierwsza prawdziwa próba rozbudowanego shortcode, więc proszę o odpowiedź na pytanie.

Odpowiedz

13

Spróbuj tego. Najpierw dodać następujący orderby filter w functions.php

function posts_orderby_lastname ($orderby_statement) 
{ 
    $orderby_statement = "RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1) DESC"; 
    return $orderby_statement; 
} 

a następnie używać go w zapytaniu jak tak

add_filter('posts_orderby' , 'posts_orderby_lastname'); 
    $loop = new WP_Query(
     array (
      'post_type' => 'staff', 
      'staff-type' => $type 
     ) 
    ); 

i po pętli wyjąć filtr

remove_filter('posts_orderby' , 'posts_orderby_lastname'); 
+0

działa idealnie. Czy istnieje sposób umieszczenia pierwszej funkcji w innym miejscu poza plikiem functions.php? Tworzę niestandardowe wtyczki postów dla przenośności iw przyszłości, jeśli mój klient zmieni swój motyw, który by się zepsuł. Dzięki za pomoc. –

+0

Znalazłem ten artykuł o rozwoju wtyczki, który pokazuje przykład dodania działania http://plugintutorials.blogspot.com/2011/04/wordpress-plugin-tutorial-part-iv-lets.html - Myślę, że możesz po prostu dodać to w twoim pliku wtyczki. – user850010

+0

Słodko, to też działa. Dzięki jeszcze raz! –