iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
1
Modern Web

讓0基礎的你也能製作簡單wordpress主題系列 第 25

【Day25】 帶你看看wordpress WP_Query的分類與標籤,讓你可以只顯示每個分類的第一項而不重複

之前,我們都有少量涉及到WP_Query的分類和標籤,不過我們並沒有詳細地向大家作解釋,這篇我們會為大家集中探討WP_Query分類和標籤的部分。在最後,我們亦都會提供較深入的使用方法給大家,讓大家能夠更充分地瞭解到它們的用法。

好,廢話少說我們立即開始吧

分類與標籤

其實內裡有很多,是和文章,頁面的編碼是相近的,我們一起來看看吧

名稱/id

相信這已經不用多說了吧,不過大家應該還是不知道,放到WP_Query裡面,該是怎樣的模樣吧

編碼

$args = array(
    //分類的
    'cat' => '12, 13',   //分類id
    'category_name' => 'blog, post',    //分類名稱
    //標籤的
    'tag_id' => '12, 13',   //標籤id
    'tag' => 'blog, post',    //分類名稱
);

是不是和頁面或文章的,很相像呢,沒錯,其實就只是這麼簡單^^

同時顯示數個分類的頁面或文章

這裡也同樣有著post_in和post_not_in類近的編碼,我們先來看分類先的吧

編碼

$args = array(
    'category__and' => array(     //需要包含列出的全部分類,才會顯示
        '12',
        '13',
        '14'
    )
    'category__in' => array(     //只要有包括其中一個分類,就會顯示
        '12',
        '13',
        '14'
    )
    'category__not_in' => array(  //只要包括內裡其中一個分類,就不會顯示
        '12',
        '13',
        '14',
    )
);

這些確實是看懂了,不過,假若你是希望顯示有分類id:12,13,14 的文章,但篩選出來的文章,只要是有分類id 15,就不會顯示出來,然後希望只顯示三篇文章,那麼我們可以怎樣做?

這情況,我們可以把category_in和category_not_in一起使用。我們先利用category_in,來篩選想要的文章分類,接著category_not_in,把不要的篩選出去,最後再用昨天使用過的:posts_per_page 來限制列出文章數目,這樣就能夠做到這效果了,比起想像中還要簡單吧

編碼參考:

$args = array(

 'category__in' => array(    
        '12',
        '13',
        '14'
    )
    'category__not_in' => array(  
        '15',
     )

同時顯示數個標籤的頁面或文章

標籤有點有趣,除了像平常那樣,可以用id,來篩選需要的id外,這裡也是可以用名字的

編碼與解釋

$args = array(

     'tag__and' => array(  //需要包括列出的全部標籤,才會顯示 
        '12',
        '13',
        '14'

    'tag__in' =>  array(    //只要有包括其中一個標籤,就會顯示

        '12',
        '13',
        '14'

    'tag__not_in' => array(  //只要有包括其中一個標籤,就不會顯示
        '12',
        '13',
        '14'
         
        
     'tag_slug__and' => array( //需要包括列出的全部標籤,才會顯示
        'page 1'
        'page 2'
        'page 3'
        
      
     'tag_slug__in' => array( //只要有包括其中一個標籤的名稱,就會顯示
        'page 1'
        'page 2'
        'page 3'
    )
);

老實說,這裡真的沒什麼特別,就只是不知為何,無故地在這裡,會可以使用標籤的名字,作為分類。

列出每項分類的第一項

怎樣列出分類,對於大家來說,相信已經不難了,我們在這裡先把編碼放下來吧。

編碼片段:

$args = array(

 'category__in' => array(    
        '12',
        '13',
        '14',
    )
'posts_per_page' => 3,
'type' => 'post'
)

不過這裡有一個問題,系統只會把這三個分類的文章篩選出來,然後再用posts_per_page選出三篇最新的文章,換句話說,系統並不會理會是不是同一個分類,只要是最新,它就會放出來,這和我們的原意有點距離。

當然你可以把每個分類,都獨立弄成一個loop,,然後再用category__in和 posts_per_page ,來顯示那分類的最新文章。但假若這裡有30個分類,那麼你豈不是要重複這動作30次了嗎?這既不明智,也浪費你的時間。

那麼我們可以怎樣做呢? 我們可以加入額外編碼,來做到這效果:

<?php
$arg_cat = array(
'include' => '12,13,14'
);

$categories = get_categories($arg_cat);
foreach($categories as $category):

  $args = array(

  'category__in' => $category->term_id,
  'posts_per_page' => 1,
  'type' => 'post'
  );

$lastpage = new WP_Query( $args );

if($lastpage->have_posts()): 

  while($lastpage-> have_posts()): $lastpage->the_post();?>

   <?php get_template_part('include/content');?>

	  <?php endwhile; endif; wp_reset_postdata(); endforeach; ?>

我們這裡做的其實,就和我們人手重複30次去製作一個新loop是一樣,只是我們把這一切,交給了電腦處理,而不是,人手慢慢列出來。

'include'

我們需要告訴系統,這個之後的loop,應該去找什麼分類來產生的,所以我們在這裡,用include設定了,12,13,14這三個數字,這樣系統就會知道,它是要找id,12,13,14,這三個分類。

get_categories

雖說是這樣但系統其實並不知道他是要到那裡找的,所以我們需要加入get_categories,來跟系統說,我們是要找分類裡面,這三個id,這樣系統就會找取了這些分類的內容了。我們這裡同時也設定了個代號$categories給他,這樣方便我們在下方使用。

用var_dump來查看編碼

到這裡大家可以嘗試 var_dump($categories) 來查看一下編碼(當然$categories是看你在get_categories怎樣設定吧),假如沒錯的話,你會看到他是顯示了一大堆編碼出來的,並不單單只有id。

這一點非常重要,因為這意味著,我們之後是需要指令wordpress,只提取id部分,那麼才能夠套用到,category_in裡面,因為category_in是必需要用分類的id,我想這點大家應該還記得吧。

foreach

不過我們還沒有令到他會懂得自己重複去列印出來,讓整個事情能夠順利運行。這裡,我們可以利用到foreach,這個php的loop,之前我們也有使用過的,不過不記得也不緊要,這裡再為大家解釋一次吧foreach可以說是我們平常用的,要來列出文章的精簡版,他會無條件地不斷運行,直到運行完才會結束

例如 :

<?php
$arg =array( "1" , "2" , "3" );
foreach ($arg as $value ){
 echo 'a='.$value;
}

那麼他就會這樣:a=1a=2a=3

你會留意到他不但是重複著顯示哪些我們設定好的數字,也同時會重複列印a=出來,直到列完所有數值,所以這就是為什麼我會說,這樣做能夠代替你人手重複輸入30次這沉悶的過程了。我們這裡也加入了$categories as $category,這在foreach裡面,是必需要加入的,後方設定了的代號,才能用到loop內裡

loop 內裡

看到例子,應該會知道,我們需要把我們設定好的值,放進去一組編碼裏,讓這個loop能夠正式運行,既然我們是要列出文章, 那麼當然就是把整個文章的loop都放進去。WP_Query也需要放進去,這樣文章loop,才會按照分類去顯示出來。

$category->term_id

不過我們希望分類能夠用到我們上方設定好的,我們在這裡加入$category,讓他知道需要跟從那裡。另外因為include是會出了大量我們用不著的編碼,所以我們使用了term_id,讓wordpress只會提取id部份。

好了這樣就完成了,希望大家能跟上吧。

總結

希望這篇文章,能夠幫助到大家,對於WP_Query,有一個初步的認識,也能夠初步地體會到,是可以怎樣應用吧。

對了,最後那個雖然真的有點複雜,不過大家只要用到商店分類,文章分類之類,也是蠻常用到的,除了顯示文章內容,你也可以選擇是利用post=attachment,來顯示每個分類的最新商品圖片/文章圖片,若能夠了解了,對你的幫助也是不少。

好這篇,就到這裡了,下篇文章見。


上一篇
【Day 24】 Wordpress WP_Query小入門,帶你看看WP_Query世界,讓你簡單操控wordpress loop
下一篇
[Day 26] 想讓 Wordpress主題能做到多語言?看完這篇你也懂
系列文
讓0基礎的你也能製作簡單wordpress主題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言