フォークソノミー
データベース(例)
wp_folksonomy
カラム名 | データ型 | AI | その他 |
id | int | Auto_Increment | |
post_id | int | get_the_ID()で取得 | |
folksonomy | varchar(10) | 最大10文字まで | |
created | datetime | ||
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(); ?>