💬

wordpressでACFの保守性を高める

2022/12/02に公開

introduction

ACFってマジで便利で、クライアント側から簡単に文書修正ができ、かつその設定範囲はエンジニアによって無限大に広がる。しかし、自分が考えた中では非常に保守性の悪いコードになってしまっている。例えば、この下の中のactivity3がなくなって、新しくactivityを入れてほしいとなったときにその保守性の悪さは明らかになる(順番指定をしているが、3がなくなるだけで4を3にする作業は手作業のため、絶対バグる)。これを解消しようと思って考えた結果、たどり着いたのがACFの機能をより活用するということだ。

ではやってみる。

ACFのグループ機能を活用する

カスタムフィールドをグループ化することによって、実は可変性が簡単に実現できる。

このようにして、サブグループの内容はそれぞれのグループで不変にする(オブジェクト化する)ことによって、1つの可変コンポーネントとして利用できる。

実際にテーマ内に使うなら、以下のようにしてみるとよい。

オリジナルテーマ
<?php $fields = get_field_objects();?>
           <?php foreach($fields as $filed_name=>$field_info):?>
               <?php $field_array = $field_info['value'];?>
               <!-- コンポーネント -->
               <div class="flex-start hotel-list -sp-col mt-z">
                   <div class="hotel-list_hotel">
                   <img src="<?php echo get_stylesheet_directory_uri()."/images/".$field_array['hotelimg']; ?>" alt="<?php echo $field_array['hotelimgalt'];?>" class="hotel-img ob-fit">
                   </div>
                   <div class="hotel-list_text">
                   <h2 class="hotel-name"><?php echo $field_array['hotelname'];?></h2>
                   <h3 class="hotel-copy"><?php echo $field_array['hoteltitle'];?></h3>
                   <p class="justify"><?php echo $field_array['hoteltext'];?></p>
                   </div>
               </div>
           <? endforeach;?>

もしもグループ外にコンポーネント以外のカスタムフィールドを設定したければ(以下の写真)、以下のようにすれば良い。

別のカスタムフィールドを設定
<?php $fields = get_field('hotel');?>
        <?php var_dump($fields);?>
            <?php foreach($fields as $filed_name=>$field_info):?>
                <!-- コンポーネント -->
                <div class="flex-start hotel-list -sp-col mt-z">
                    <div class="hotel-list_hotel">
                    <img src="<?php echo get_stylesheet_directory_uri()."/images/".$field_info['hotelimg']; ?>" alt="<?php echo $field_info['hotelimgalt'];?>" class="hotel-img ob-fit">
                    </div>
                    <div class="hotel-list_text">
                    <h2 class="hotel-name"><?php echo $field_info['hotelname'];?></h2>
                    <h3 class="hotel-copy"><?php echo $field_info['hoteltitle'];?></h3>
                    <p class="justify"><?php echo $field_info['hoteltext'];?></p>
                    </div>
                </div>
            <? endforeach;?>

Discussion