【Day 30 】 Custom field 进阶篇,让你学会与custom post type 一并使用

在上次介绍关於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;?>
 

这样设定後,我们无论在画家还是画作两方,都会有互相连接的连结了。

这次的文章,就先到这里停止吧,当然可以说的,其实还有很多的,之後时间充裕的话,我会再回来更新和整理的。


<<:  每天来点 Vue.js 吧 目录&总结

>>:  [DAY 30] 总结及回顾

[Day00] 这次可以跟上 Kaggle 30 Days 挑战了吧

前言 写在前面 Kaggle 不知道从何时开始,每年会有一段时间举办 30 days challen...

【领域展开 19 式】初次使用 Elementor 编辑页面

编辑器玩很大,Elementor 功能多多 今天本来预计要撰写 WordPress 後台左手边功能栏...

[Day01] 前言

身为一个商业设计的转职者,从懵懂到认识 HTML 与 CSS 之後,接着来到进入 JavaScrip...

【Day 9】Replica 之间的一致性

7.3 eventual consistency 还没写QQ 这章会来聊聊 consistency...

【从零开始的Swift开发心路历程-Day14】打造自己的私房美食名单Part3(完)

昨天已经能让TableViewCell显示餐厅资料了 但....好像有点单调,让我们来加点餐厅的图片...