カスタムフィールドを使う場合の設定色々

カスタムフィールドを作る

プラグイン「Advanced Custom Fields」略称ACF

カスタムフィールドを「クイック編集」できるようにする

プラグイン「ACF QuickEdit Fields」

カスタムフィールドを標準の検索対象にする

「ACF: Better Search」

カスタムフィールドによる絞り込み検索機能

これは「WP Custom Fields Search」というプラグインがあったが、今は更新されていないためセキュリティの観点から導入はお勧めできない。

他に可能なプラグインは数万円単位で費用がかかるため、自分でphpファイルに追記して実装することになる。

追記が必要になるファイルは、

「function.php」・・・検索ロジック

「searchform.php」・・・検索フォーム(ユーザーに検索してもらうための画面)

「search.php」・・・検索結果

ACFでは、都道府県(prefectures)、温泉名(onsen_name)、泉質(quality)というカスタムフィールドを作成済み。

それぞれの項目で検索絞り込みを実現するため、以下のコードを実装した。

function.php

// カスタム検索クエリを追加
    function custom_search_query($query) {
        if ($query->is_search && !is_admin()) {
            $meta_query = [];

            // 都道府県の検索条件
            if (!empty($_GET['prefectures'])) {
                $meta_query[] = [
                    'key' => 'prefectures',
                    'value' => sanitize_text_field($_GET['prefectures']),
                    'compare' => '='
                ];
            }

            // 温泉名の検索条件
            if (!empty($_GET['onsen_name'])) {
                $meta_query[] = [
                    'key' => 'onsen_name',
                    'value' => sanitize_text_field($_GET['onsen_name']),
                    'compare' => 'LIKE'
                ];
            }

            // 泉質の検索条件
            if (!empty($_GET['quality'])) {
                $meta_query[] = [
                    'key' => 'quality',
                    'value' => sanitize_text_field($_GET['quality']),
                    'compare' => 'LIKE'
                ];
            }

            if ($meta_query) {
                $query->set('meta_query', $meta_query);
            }
        }
        return $query;
    }
    add_filter('pre_get_posts', 'custom_search_query');

searchform.php

<form class="search-box input-box" method="get" action="<?php echo home_url('/'); ?>">
    <?php else: ?>
    <form class="amp-form search-box" method="get" action="<?php echo home_url('/'); ?>">
        <?php endif ?>
        <input type="text" placeholder="<?php _e('サイト内を検索', THEME_NAME) ?>" name="s" class="search-edit" aria-label="input" value="<?php echo esc_attr($s); ?>">
			<span style="text-align: center;">--- 絞り込み条件 ---</span>
        <select name="prefectures" class="search-prefectures">
            <option value=""><?php _e('都道府県を選択', THEME_NAME); ?></option>
            <option value="北海道" <?php selected($_GET['prefectures'], '北海道'); ?>><?php _e('北海道', THEME_NAME); ?></option>
            <option value="青森" <?php selected($_GET['prefectures'], '青森'); ?>><?php _e('青森', THEME_NAME); ?></option>
            <option value="岩手" <?php selected($_GET['prefectures'], '岩手'); ?>><?php _e('岩手', THEME_NAME); ?></option>
            <option value="宮城" <?php selected($_GET['prefectures'], '宮城'); ?>><?php _e('宮城', THEME_NAME); ?></option>
            <option value="秋田" <?php selected($_GET['prefectures'], '秋田'); ?>><?php _e('秋田', THEME_NAME); ?></option>
            <option value="山形" <?php selected($_GET['prefectures'], '山形'); ?>><?php _e('山形', THEME_NAME); ?></option>
            <option value="福島" <?php selected($_GET['prefectures'], '福島'); ?>><?php _e('福島', THEME_NAME); ?></option>
            <option value="茨城" <?php selected($_GET['prefectures'], '茨城'); ?>><?php _e('茨城', THEME_NAME); ?></option>
            <option value="栃木" <?php selected($_GET['prefectures'], '栃木'); ?>><?php _e('栃木', THEME_NAME); ?></option>
            <option value="群馬" <?php selected($_GET['prefectures'], '群馬'); ?>><?php _e('群馬', THEME_NAME); ?></option>
            <option value="埼玉" <?php selected($_GET['prefectures'], '埼玉'); ?>><?php _e('埼玉', THEME_NAME); ?></option>
            <option value="千葉" <?php selected($_GET['prefectures'], '千葉'); ?>><?php _e('千葉', THEME_NAME); ?></option>
            <option value="東京" <?php selected($_GET['prefectures'], '東京'); ?>><?php _e('東京', THEME_NAME); ?></option>
            <option value="神奈川" <?php selected($_GET['prefectures'], '神奈川'); ?>><?php _e('神奈川', THEME_NAME); ?></option>
            <option value="新潟" <?php selected($_GET['prefectures'], '新潟'); ?>><?php _e('新潟', THEME_NAME); ?></option>
            <option value="富山" <?php selected($_GET['prefectures'], '富山'); ?>><?php _e('富山', THEME_NAME); ?></option>
            <option value="石川" <?php selected($_GET['prefectures'], '石川'); ?>><?php _e('石川', THEME_NAME); ?></option>
            <option value="福井" <?php selected($_GET['prefectures'], '福井'); ?>><?php _e('福井', THEME_NAME); ?></option>
            <option value="山梨" <?php selected($_GET['prefectures'], '山梨'); ?>><?php _e('山梨', THEME_NAME); ?></option>
            <option value="長野" <?php selected($_GET['prefectures'], '長野'); ?>><?php _e('長野', THEME_NAME); ?></option>
            <option value="岐阜" <?php selected($_GET['prefectures'], '岐阜'); ?>><?php _e('岐阜', THEME_NAME); ?></option>
            <option value="静岡" <?php selected($_GET['prefectures'], '静岡'); ?>><?php _e('静岡', THEME_NAME); ?></option>
            <option value="愛知" <?php selected($_GET['prefectures'], '愛知'); ?>><?php _e('愛知', THEME_NAME); ?></option>
            <option value="三重" <?php selected($_GET['prefectures'], '三重'); ?>><?php _e('三重', THEME_NAME); ?></option>
            <option value="滋賀" <?php selected($_GET['prefectures'], '滋賀'); ?>><?php _e('滋賀', THEME_NAME); ?></option>
            <option value="京都" <?php selected($_GET['prefectures'], '京都'); ?>><?php _e('京都', THEME_NAME); ?></option>
            <option value="大阪" <?php selected($_GET['prefectures'], '大阪'); ?>><?php _e('大阪', THEME_NAME); ?></option>
            <option value="兵庫" <?php selected($_GET['prefectures'], '兵庫'); ?>><?php _e('兵庫', THEME_NAME); ?></option>
            <option value="奈良" <?php selected($_GET['prefectures'], '奈良'); ?>><?php _e('奈良', THEME_NAME); ?></option>
            <option value="和歌山" <?php selected($_GET['prefectures'], '和歌山'); ?>><?php _e('和歌山', THEME_NAME); ?></option>
            <option value="鳥取" <?php selected($_GET['prefectures'], '鳥取'); ?>><?php _e('鳥取', THEME_NAME); ?></option>
            <option value="島根" <?php selected($_GET['prefectures'], '島根'); ?>><?php _e('島根', THEME_NAME); ?></option>
            <option value="岡山" <?php selected($_GET['prefectures'], '岡山'); ?>><?php _e('岡山', THEME_NAME); ?></option>
            <option value="広島" <?php selected($_GET['prefectures'], '広島'); ?>><?php _e('広島', THEME_NAME); ?></option>
            <option value="山口" <?php selected($_GET['prefectures'], '山口'); ?>><?php _e('山口', THEME_NAME); ?></option>
            <option value="徳島" <?php selected($_GET['prefectures'], '徳島'); ?>><?php _e('徳島', THEME_NAME); ?></option>
            <option value="香川" <?php selected($_GET['prefectures'], '香川'); ?>><?php _e('香川', THEME_NAME); ?></option>
            <option value="愛媛" <?php selected($_GET['prefectures'], '愛媛'); ?>><?php _e('愛媛', THEME_NAME); ?></option>
            <option value="高知" <?php selected($_GET['prefectures'], '高知'); ?>><?php _e('高知', THEME_NAME); ?></option>
            <option value="福岡" <?php selected($_GET['prefectures'], '福岡'); ?>><?php _e('福岡', THEME_NAME); ?></option>
            <option value="佐賀" <?php selected($_GET['prefectures'], '佐賀'); ?>><?php _e('佐賀', THEME_NAME); ?></option>
            <option value="長崎" <?php selected($_GET['prefectures'], '長崎'); ?>><?php _e('長崎', THEME_NAME); ?></option>
            <option value="熊本" <?php selected($_GET['prefectures'], '熊本'); ?>><?php _e('熊本', THEME_NAME); ?></option>
            <option value="大分" <?php selected($_GET['prefectures'], '大分'); ?>><?php _e('大分', THEME_NAME); ?></option>
            <option value="宮崎" <?php selected($_GET['prefectures'], '宮崎'); ?>><?php _e('宮崎', THEME_NAME); ?></option>
            <option value="鹿児島" <?php selected($_GET['prefectures'], '鹿児島'); ?>><?php _e('鹿児島', THEME_NAME); ?></option>
            <option value="沖縄" <?php selected($_GET['prefectures'], '沖縄'); ?>><?php _e('沖縄', THEME_NAME); ?></option>
            <option value="海外/その他" <?php selected($_GET['prefectures'], '海外/その他'); ?>><?php _e('海外/その他', THEME_NAME); ?></option>
        </select>
        <input type="text" name="onsen_name" class="search-onsen" placeholder="<?php _e('温泉名を入力', THEME_NAME); ?>" value="<?php echo isset($_GET['onsen_name']) ? esc_attr($_GET['onsen_name']) : ''; ?>">
        <input type="text" name="quality" class="search-quality" placeholder="<?php _e('泉質を入力', THEME_NAME); ?>" value="<?php echo isset($_GET['quality']) ? esc_attr($_GET['quality']) : ''; ?>">
        <button type="submit" class="search-submit" aria-label="button"><span class="fa fa-search" aria-hidden="true"></span>検索する</button>
    </form>

search.php

<?php
    $args = [
        'post_type' => 'post',
        's' => get_search_query(),
        'meta_query' => []
    ];

    if (isset($_GET['prefectures']) && !empty($_GET['prefectures'])) {
        $args['meta_query'][] = [
            'key' => 'prefectures',
            'value' => sanitize_text_field($_GET['prefectures']),
            'compare' => '='
        ];
    }

    if (isset($_GET['onsen_name']) && !empty($_GET['onsen_name'])) {
        $args['meta_query'][] = [
            'key' => 'onsen_name',
            'value' => sanitize_text_field($_GET['onsen_name']),
            'compare' => 'LIKE'
        ];
    }

    if (isset($_GET['quality']) && !empty($_GET['quality'])) {
        $args['meta_query'][] = [
            'key' => 'quality',
            'value' => sanitize_text_field($_GET['quality']),
            'compare' => 'LIKE'
        ];
    }

    $query = new WP_Query($args);
?>

<?php if (have_posts()): ?>
    <?php while (have_posts()): the_post(); ?>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <div><?php the_excerpt(); ?></div>
        <div>
            <?php if (get_field('prefectures')): ?>
                <p><?php _e('都道府県: ', THEME_NAME); ?><?php the_field('prefectures'); ?></p>
            <?php endif; ?>
            <?php if (get_field('onsen_name')): ?>
                <p><?php _e('温泉名: ', THEME_NAME); ?><?php the_field('onsen_name'); ?></p>
            <?php endif; ?>
            <?php if (get_field('quality')): ?>
                <p><?php _e('泉質: ', THEME_NAME); ?><?php the_field('quality'); ?></p>
            <?php endif; ?>
        </div>
    <?php endwhile; ?>
<?php else: ?>
    <p><?php _e('検索結果が見つかりませんでした。', THEME_NAME); ?></p>
<?php endif; ?>

コメント

タイトルとURLをコピーしました