フォークソノミー

WordPress

データベース(例)

wp_folksonomy

カラム名データ型AIその他
idintAuto_Increment
post_idintget_the_ID()で取得
folksonomyvarchar(10)最大10文字まで
createddatetime

single.php

・フォークソノミーは最大5個まで追加可能(5個以上になると既存のどれかを削除しないと追加できない仕様)

・フォークソノミーは最大10文字まで

<?php
		
	global $wpdb;
	$error_message = '';
	
	// フォークソノミーの数を取得
	$post_id = get_the_ID();
	$table_folksonomy = $wpdb->prefix . 'folksonomy';
	$number_of_folksonomy = $wpdb->get_var(
		$wpdb->prepare("SELECT COUNT(*) FROM $table_folksonomy WHERE post_id = %d", $post_id)
	);
	
	// フォークソノミーの追加
	if ( isset($_POST['add_folk']) && !empty($_POST['input_folk']) ) {
		$input_folk = sanitize_text_field($_POST['input_folk']);
		if ( $number_of_folksonomy >= 5 ) {
			$error_message = 'タグは5個までしか追加できません。削除してから再度追加してください。';
		} elseif ( mb_strlen($input_folk) > 10 ) {
			$error_message = '10文字以内で入力してください。';
		} else {
			$data = array(
				'post_id' => $post_id,
				'folksonomy' => $input_folk,
				'created' => current_time('mysql'),
			);
			$format = array('%d', '%s', '%s'); 
			$inserted = $wpdb->insert($table_folksonomy, $data, $format);
			if ( $inserted === false ) {
				echo 'ADD ERROR';
			} else {
				wp_redirect(get_permalink());
				exit;
			}
		}
	}
		
	// フォークソノミーの削除
	if ( isset($_POST['delete_folk']) && !empty($_POST['folk_id']) ) {
		$folk_id = intval($_POST['folk_id']);
		$deleted = $wpdb->delete($table_folksonomy, array('id' => $folk_id), array('%d'));
		if ( $deleted === false ) {
			echo 'DELETE ERROR';
		} else {
			wp_redirect(get_permalink());
			exit;
		}
	}
?>	
<?php get_header(); ?>
<main>
		<!-- folksonomy -->
		<?php
			global $wpdb;
			$table_folksonomy = $wpdb->prefix . 'folksonomy';
			$post_id = get_the_ID();
			$results = $wpdb->get_results(
				$wpdb->prepare("SELECT * FROM $table_folksonomy WHERE post_id = %d", $post_id)
			);
		?>
		<?php if ( $results ) : ?>
			<section class='folksonomy'>
				<?php foreach ( $results as $result ) : ?>
					<div>
						<a href="<?php echo 'https://xxx.com/folksonomy/?folk=' . esc_html($result->folksonomy) ?>"><?php echo esc_html($result->folksonomy); ?></a>
						<form method='post' action=''>
							<input type='hidden' name='folk_id' value='<?php echo esc_attr($result->id); ?>'>
							<input type='submit' name='delete_folk' value='削除'>
						</form>
					</div>
				<?php endforeach; ?>
			</section>
		<?php endif; ?>
		<section class='folksonomy_add'>
			<?php if ( !empty($error_message) ) : ?>
				<p><?php echo esc_html($error_message); ?></p>
			<?php endif; ?>
			<?php if ( $number_of_folksonomy >= 5 ) : ?>
				<p>タグが5個あるため、新しいタグを追加するには削除してください。</p>
			<?php else : ?>
				<form method='post' action=''>
					<input type='text' name='input_folk' placeholder='10文字以内で入力'>
					<input type='submit' name='add_folk' value='タグを追加'>
				</form>
			<?php endif; ?>
		</section>
</main>
<?php get_footer(); ?>

page-folksonomy.php

ttps://xxx.com/folksonomy/?folk=’ . esc_html($result->folksonomy) ?で固定ページに飛ぶ

・$_GET[‘folk’]でパラメータをゲットして、wp_folksonomyテーブルのpost_idから記事一覧を取得する

<?php get_header(); ?>
<main class='page_folksonomy'>
    <?php
    global $wpdb;

    // クエリパラメータを取得
    $folk = isset($_GET['folk']) ? sanitize_text_field($_GET['folk']) : 'パラメーターがありません';
    // 初期化
    $error_message = '';
    $posts = [];

    // フォークソノミーに関連する投稿を取得
    if ($folk) {
        $table_folksonomy = $wpdb->prefix . 'folksonomy';
        $posts = $wpdb->get_results(
            $wpdb->prepare("SELECT * FROM $table_folksonomy WHERE folksonomy = %s", $folk)
        );

        if (empty($posts)) {
            $error_message = '該当する記事が見つかりませんでした。';
        }
    } else {
        $error_message = 'フォークソノミーが指定されていません。';
    }
    ?>

    <h1><?php echo esc_html($folk); ?></h1>
    <?php if (!empty($error_message)) : ?>
        <p><?php echo esc_html($error_message); ?></p>
    <?php else : ?>
        
            <?php foreach ($posts as $post) : ?>
                <?php 
                $post_data = get_post($post->post_id);
                if ($post_data) :
                ?>
				<article>
                    <dl>
						<dt>
							<a href="<?php echo get_permalink($post_data->ID); ?>">
								<?php if (has_post_thumbnail($post_data->ID)) : ?>
									<?php echo get_the_post_thumbnail($post_data->ID); ?>
								<?php endif; ?>
							</a>
						</dt>
						<dd>
                            <a>
								<h3><?php echo esc_html(get_the_title($post_data->ID)); ?></h3>
							</a>
							<div>
								<time><?php echo get_the_date('Y-m-d H:i', $post_data->ID); ?></time>
							</div>
						</dd>
                    </dl>
				</article>
                <?php endif; ?>
            <?php endforeach; ?>
        
    <?php endif; ?>
</main>
<?php get_footer(); ?>
BACK