iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
2
Modern Web

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

【Day 30 】 Custom field 進階篇,讓你學會與custom post type 一併使用

  • 分享至 

  • xImage
  •  

在上次介紹關於custom field時,我們有提及過有關於欄位類型部份。不過那時候,主要是介紹一些較基本的,而複雜則需要連同custom post一起使用。在經過day29的文章後,相信大家對於custom post type,已經有了一定的基礎。所以今天,我們一起來探索一下custom field 欄位類型裏較深奧的部份吧。

custom field 欄位類型(下篇)

關係

wordpress 設定

這功能,可以讓你製作好的post type ,出現在另一個post type裏。例如你現在開了兩個post type,一個為畫家名字,一個為畫作,你希望畫家裏可以直接用到你在畫作裡設定好的資料,那麼你就可以使用這功能了。

我們先在檔案裏,多製作一個post type 。然後回到wordpress的advance custom post type裏,開創一個新群組,把類型設定為關係。接著在以文章型別篩選裏,選擇你將會希望連接的post type。若以我剛才的例子,就會是畫作了。

這些設定好後,可以按照個人情況,選擇是否需要更改外掛內建的篩選條件的設定,這個主要會是影響您之後,在post頁面裡,可以怎樣篩選出,你希望你頁面可以連接上的post的。另外,亦可以按照情況,選擇是否需要在元素的欄位裏,選擇是否需要顯示特色圖片。

所有設定好後,我們還需要注意一下,在下方裏,你是否選擇了正確的位置,這位置能否連到你想用到的post type,以我剛才的例子,就會是畫家了,最前方的只需要為文章類型就可以了,毋須更改。

好了,最後我們到畫作裡面,隨便加入兩篇新文章,並發布。然後到畫家裏創一個新文章,這時候,底部會出現剛設定的custom field ,把剛創好的全勾選,按儲存並發佈。這樣在wordpress的部份,就設定完成了。

檔案部份

還記得之前我們怎樣另創一個板面,給post-type使用嗎?我們這裡也需要這樣做。當你創好後,我們像平常那樣加入header和 footer ,接著我們需要在get_header裏,透過get_field,像之前那樣來加入自己剛在advance cutom field 的創好新custom field,編碼參考:

<?php $drawing = get_field('drawing');

get_header();?>

設定好後,就可以處理中間的部分。當然像一般那樣,我們先加入一個div把內容包著,然後像之前設定post格式時一樣,加入the_title,讓內容可顯示出來。接著就是重點了,還記得我們是怎樣讓tag能夠顯示出來嗎,這裏的原理也是相近,我們需要讓系統當這custom field 有使用到的時候,把所有選擇了的項目,都能夠顯示出來。說到這裡應該知道要用什麼吧?就是if 和 foreach了。然後在foreach裏,則需要放入你想顯示出來的title和content,若希望加入連結,讓您能夠連接那些post的頁面,只需要透過get_page_link來實現。

編碼參考:

<div class="container">
     <h1><?php the_title();?></h1>

     <?php if($drawing): foreach($drawing as $drawing):?>
         <h3> <a href="<?php echo get_page_link($drawing->ID);?>">
          <?php echo $drawing->post_title;?> </a> </h3>
          <p> <?php echo $drawing->post_content;?> </p>
     <?php endforeach;endif;?>
</div>

你會留意到我們這次是用$drawing->post_title,而不是$drawing[post_title],您可以用
<?php var_dump($location);?>來查看一下wordpress是用怎樣的形式來顯示的,你會留意到我們要的文章title,並不是以【】的方式出現,而是放在""。也因為這樣,我們這次不能再用[]的方法,而需要用到->了。

不過這裡有一個問題,假若你希望在剛才例子中的畫作,加入額外的custom field ,例如欄位類型是text那樣,然後最後在畫家裏的版面,一併顯示出來,那麼有沒有辦法可以做到?也許你一開始會認為,直接在h3內裡,加入the_field來顯示就可以了。但事實上,這是不可以的,由於在開始時,你已經在advance custom field裏設定了系統讀取的位置是畫家那裡,畫作對於系統來說,只是一個拿資料的地方,系統並不能臨時離開這裡一會,出去外邊加入新的資料,然後再回來畫家裏,重新拿回更改過的資料,所以顯示的結果是不會有所改變。

這裡我們需要加入一個wordpress的編碼:setup_postdata($post),讓系統可以先離開畫家這個版面,到外邊加入必要的資料,編碼寫法參考:

<?php foreach($drawing as $post):?> //我們先設定為$post,方便我們之後在setup_postdata使用
 <?php setup_postdata($post);?>  
 <?php echo the_title();?>     //因為我們出了去,所以可以不再用像之前那樣出要連接文章的標題
 <?php the_field('word')?>     
<?php wp_reset_postdata();endforeach;?> //最後必須要reset的,不然你在之後,還是會繼續在外邊,沒辦法控制到畫家這個版面的內容

讓兩個post type利用custom field可以互相連接

之前,我們成功地可以在畫家裡,連接到畫作的資料,但若我們同時希望畫作可以連接到畫家的版面,那麼有沒有方法?
由於advance custom field 本身並沒有這樣的設定,所以我們需要多加入數項編碼,才能做到這效果。首先,我們先要讓系統,可以找到我們需要連接到的post_type,這點我們可以利用wordpress本身提供的編碼,get_posts來做到

編碼參考:

<?php
$args= [
       'post_type' => 'author', //你要他找出來,並連接過去的post type
       'meta_query' => [
       'key' => 'drawing', //你的custom field 名稱,透過這,就能夠讓系統更精確去找出來
       'value' => '""'.get_the_ID().'""', //提供custom post type的id
       'compare' => 'LIKE', //這樣系統,會根據我們提供的,找出最相似(like)
       ]
]
$author = get_posts($args);?>

接下來,我們只需要像之前那樣,把需要的內容,顯示出來就可以了,編碼參考:

 <?php  foreach($author as $authors):?>
     <h3> <a href="<?php echo get_page_link($authors->ID);?>"> 
      <?php echo $drawing->post_title;?> </a> </h3>
      <p> <?php echo $drawing->post_content;?> </p>
 <?php endforeach;?>
 

這樣設定後,我們無論在畫家還是畫作兩方,都會有互相連接的連結了。

這次的文章,就先到這裡停止吧,當然可以說的,其實還有很多的,之後時間充裕的話,我會再回來更新和整理的。


上一篇
【Day 29】Custom post type,讓你海量的文章也能分類起來
系列文
讓0基礎的你也能製作簡單wordpress主題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Rach
iT邦新手 4 級 ‧ 2020-10-17 08:03:17

期待30天後還有繼續更新,覺得寫得很詳細,如果有theme對主流外掛的模板擴充的教學肯定更棒了XD

可以啊,我再規劃一下,之後會再更新^^。btw,感謝您的支持

0
不惑的胖虎
iT邦新手 4 級 ‧ 2021-06-29 12:02:33

請問 這個教學文章~ 有提供完成後的檔案嗎???

我要留言

立即登入留言