@charset "UTF-8";

/*
Theme Name: Cocoon Child
Description: Cocoon専用の子テーマ
Theme URI: https://wp-cocoon.com/
Author: わいひら
Author URI: https://nelog.jp/
Template: cocoon-master
Version: 1.1.3
Text Domain: cocoon-child
*/

/************************************
** 子テーマ用のスタイルを書く
************************************/

/* 必要ならここにCSSを書く */


/************************************
** レスポンシブデザイン用
************************************/

/* 1023px以下 */
@media screen and (max-width: 1023px){

}

/* 834px以下 */
@media screen and (max-width: 834px){

}

/* 480px以下 */
@media screen and (max-width: 480px){

}
/* =========================================================
 * 玄徴録｜固定 RECORD 番号
 *
 * ・玄徴録の5カテゴリーの記事だけを対象
 * ・一度付いた番号は投稿メタに永久保存
 * ・既存記事は古い公開記事 → 新しい記事の順に初回採番
 * ・今後の新記事は最大番号 + 1
 * ========================================================= */


/**
 * 玄徴録対象カテゴリー
 */
function gencho_record_category_slugs() {
    return array(
        'urban-legends',
        'internet-horror',
        'unsolved-mysteries',
        'historical-mysteries',
        'folklore',
    );
}


/**
 * 玄徴録の記事か判定
 */
function gencho_is_record_post($post_id) {

    if (get_post_type($post_id) !== 'post') {
        return false;
    }

    $categories = wp_get_post_categories(
        $post_id,
        array('fields' => 'slugs')
    );

    if (empty($categories)) {
        return false;
    }

    return (bool) array_intersect(
        gencho_record_category_slugs(),
        $categories
    );
}


/**
 * 次のRECORD番号を取得
 */
function gencho_get_next_record_number() {

    global $wpdb;

    $meta_key = '_gencho_record_number';

    $max_number = $wpdb->get_var(
        $wpdb->prepare(
            "
            SELECT MAX(CAST(meta_value AS UNSIGNED))
            FROM {$wpdb->postmeta}
            WHERE meta_key = %s
            ",
            $meta_key
        )
    );

    return intval($max_number) + 1;
}


/**
 * 既存記事のRECORD番号を初回だけ一括作成
 *
 * 最初の実行時に、
 * 古い記事から001、002、003...
 * の順で保存します。
 */
function gencho_backfill_record_numbers() {

    $posts = get_posts(array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
        'orderby'        => array(
            'date' => 'ASC',
            'ID'   => 'ASC',
        ),
        'tax_query'      => array(
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => gencho_record_category_slugs(),
            ),
        ),
    ));

    if (empty($posts)) {
        return;
    }

    /*
     * すでに番号が付いている記事の最大番号
     */
    $next_number = gencho_get_next_record_number();

    /*
     * まだ一件も番号がない初回だけ001から開始
     */
    $has_number = false;

    foreach ($posts as $post) {
        if (get_post_meta(
            $post->ID,
            '_gencho_record_number',
            true
        ) !== '') {
            $has_number = true;
            break;
        }
    }

    if (!$has_number) {

        $number = 1;

        foreach ($posts as $post) {

            update_post_meta(
                $post->ID,
                '_gencho_record_number',
                $number
            );

            $number++;
        }

        return;
    }

    /*
     * 一部だけ未採番の場合
     */
    foreach ($posts as $post) {

        $current = get_post_meta(
            $post->ID,
            '_gencho_record_number',
            true
        );

        if ($current === '') {

            update_post_meta(
                $post->ID,
                '_gencho_record_number',
                $next_number
            );

            $next_number++;
        }
    }
}


/**
 * 新しい玄徴録記事公開時に番号を固定
 */
function gencho_assign_record_number_on_publish(
    $new_status,
    $old_status,
    $post
) {

    if ($post->post_type !== 'post') {
        return;
    }

    if ($new_status !== 'publish') {
        return;
    }

    /*
     * 既に番号があれば何もしない
     */
    $existing = get_post_meta(
        $post->ID,
        '_gencho_record_number',
        true
    );

    if ($existing !== '') {
        return;
    }

    if (!gencho_is_record_post($post->ID)) {
        return;
    }

    update_post_meta(
        $post->ID,
        '_gencho_record_number',
        gencho_get_next_record_number()
    );
}

add_action(
    'transition_post_status',
    'gencho_assign_record_number_on_publish',
    10,
    3
);


/**
 * 玄徴録｜固定番号付き記録一覧
 *
 * 使用：
 * [gencho_records count=20]
 */
function gencho_records_shortcode($atts) {

    $atts = shortcode_atts(
        array(
            'count' => 20,
        ),
        $atts,
        'gencho_records'
    );

    /*
     * 初回のみ既存記事へ番号付与
     */
    gencho_backfill_record_numbers();

    $count = max(1, intval($atts['count']));

    $query = new WP_Query(array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'posts_per_page' => $count,
        'orderby'        => 'date',
        'order'          => 'DESC',

        'tax_query' => array(
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => gencho_record_category_slugs(),
            ),
        ),
    ));

    if (!$query->have_posts()) {
        return '';
    }

    ob_start();

    echo '<div class="gencho-record-list">';

    while ($query->have_posts()) {

        $query->the_post();

        $post_id = get_the_ID();

        $number = intval(
            get_post_meta(
                $post_id,
                '_gencho_record_number',
                true
            )
        );

        $record_number = sprintf(
            '%03d',
            $number
        );

        /*
         * メインカテゴリー
         */
        $category_name = '';

        $categories = get_the_category($post_id);

        if (!empty($categories)) {

            foreach ($categories as $category) {

                if (
                    in_array(
                        $category->slug,
                        gencho_record_category_slugs(),
                        true
                    )
                ) {
                    $category_name = $category->name;
                    break;
                }
            }
        }

        echo '<article class="gencho-record-item">';

        echo '<a class="gencho-record-item-link" href="' .
            esc_url(get_permalink()) .
            '">';


        /* ---------- サムネイル ---------- */

        echo '<div class="gencho-record-thumb">';

        if (has_post_thumbnail()) {

            echo get_the_post_thumbnail(
                $post_id,
                'large',
                array(
                    'loading' => 'lazy',
                    'alt'     => esc_attr(get_the_title()),
                )
            );

        } else {

            echo '<div class="gencho-record-thumb-empty">';
            echo 'NO IMAGE';
            echo '</div>';
        }

        echo '</div>';


        /* ---------- 本文 ---------- */

        echo '<div class="gencho-record-content">';


        echo '<div class="gencho-record-meta">';

        echo '<span class="gencho-record-number">';
        echo 'RECORD / ' .
            esc_html($record_number);
        echo '</span>';

        if ($category_name !== '') {

            echo '<span class="gencho-record-category">';
            echo esc_html($category_name);
            echo '</span>';
        }

        echo '</div>';


        echo '<h3 class="gencho-record-title">';
        echo esc_html(get_the_title());
        echo '</h3>';


        echo '<p class="gencho-record-excerpt">';

        echo esc_html(
            wp_trim_words(
                wp_strip_all_tags(
                    get_the_excerpt()
                ),
                48,
                '…'
            )
        );

        echo '</p>';


        echo '<span class="gencho-record-open">';
        echo '記録を開く →';
        echo '</span>';


        echo '</div>';

        echo '</a>';

        echo '</article>';
    }

    echo '</div>';

    wp_reset_postdata();

    return ob_get_clean();
}

add_shortcode(
    'gencho_records',
    'gencho_records_shortcode'
);