Advanced Custom Fields の「関連」「投稿オブジェクト」はとても便利だけど、非公開の記事まで公開されちゃから要注意だよ、という話。

Advanced Custom Fields プラグイン。
めっちゃ便利です。
WordPress案件だと必須だというくらい重宝させていただいています。

で、その機能の中に「関連」「投稿オブジェクト」というフィールドタイプがあります(両方共似たようなもん)。
ブログ記事に関連する記事を手動でピックアップして関連付けるという機能です。
・シリーズ物の記事の過去記事を関連付けたり。
・ブログ記事に、店舗用カスタム投稿を関連付けて、新たな導線を作ったり。
・トップページ用のスライダーをオプションページで作成したり。

で、つい最近、それについて納品先から指摘がありました。
「非公開記事が出ちゃってるんだけど……。」

(;・∀・)

出ますね。
非公開記事も予約投稿も選択できちゃうし、公開してないのに出ちゃいますね。

というわけで、こちらの対応はテンプレートファイルからの呼び出し側にてコントロールします。
なぜ、プラグインの方を改修しないの?という疑問については、予約投稿をしたものも「関連」で選択したいし、という理由です。

ついでに、非公開記事については、管理者ログイン中には【非公開: 記事タイトル】という感じで出すようにします。
(通常のループの中と似たようにします)

以下のスクリプトは、オプションページでトップページ用のおすすめ記事を出す!という例になります。

<?php
$articles = get_field( 'acf-pickup-articles', 'option' );
$current_user = wp_get_current_user()
?>
<?php if ( ! empty( $articles ) ) : ?>
    <ul>
        <?php foreach ( $articles as $article ) : ?>
            <?php if ( 'publish' == $article->post_status || ( 'private' == $article->post_status && is_user_logged_in() && in_array( 'administrator', $current_user->roles ) ) ) : ?>
                <li>
                    <p class="title">
                        <a href="<?php echo esc_url( get_permalink( $article->ID ) ); ?>">
                            <?php if ( 'private' == $article->post_status && is_user_logged_in() && in_array( 'administrator', $current_user->roles ) ) : ?>
                                非公開:
                            <?php endif; ?>
                            <?php echo esc_html( $article->post_title ); ?>
                        </a>
                    </p>
                </li>
            <?php endif; ?>
        <?php endforeach; ?>
    </ul>
<?php endif; ?>

とっても便利なプラグインはとっても便利だけど、自分が作っていないだけに全仕様を把握して使うわけではありません。
ちゃんと動く理屈を把握して使いましょうね、という話でした。

スポンサードリンク