<?php
get_header(); // ヘッダーを読み込み
?>
<div class=”av-ranking-wrapper”>
<!– ヘッダー –>
<header class=”ranking-header”>
<div class=”container”>
<h1 class=”ranking-title”><?php echo get_the_title(); ?></h1>
<p class=”ranking-description”><?php echo get_the_excerpt(); ?></p>
<div class=”ranking-meta”>
<span class=”update-date”>最終更新: <?php echo get_the_modified_date(‘Y年n月j日’); ?></span>
</div>
</div>
</header>
<!– メインコンテンツ –>
<div class=”ranking-content”>
<div class=”container”>
<!– 導入部 –>
<div class=”ranking-intro”>
<?php the_content(); // ページコンテンツを表示 ?>
</div>
<!– ランキングリスト –>
<div class=”ranking-list”>
<?php
// ランキング用の女優を取得
$args = array(
‘post_type’ => ‘av_actress’, // カスタム投稿タイプ
‘posts_per_page’ => 20, // 20件表示
‘meta_key’ => ‘actress_rank’, // ランキング順の並び替え用メタキー
‘orderby’ => ‘meta_value_num’,
‘order’ => ‘ASC’,
);
$actress_query = new WP_Query($args);
// 女優の投稿がある場合
if ($actress_query->have_posts()) :
$rank = 1; // ランク初期値
while ($actress_query->have_posts()) : $actress_query->the_post();
// メタデータの取得
$age = get_post_meta(get_the_ID(), ‘actress_age’, true);
$height = get_post_meta(get_the_ID(), ‘actress_height’, true);
$bust = get_post_meta(get_the_ID(), ‘actress_bust’, true);
$cup = get_post_meta(get_the_ID(), ‘actress_cup’, true);
$waist = get_post_meta(get_the_ID(), ‘actress_waist’, true);
$hip = get_post_meta(get_the_ID(), ‘actress_hip’, true);
$debut_year = get_post_meta(get_the_ID(), ‘actress_debut_year’, true);
$works_count = get_post_meta(get_the_ID(), ‘actress_works_count’, true);
$followers = get_post_meta(get_the_ID(), ‘actress_followers’, true);
$awards_count = get_post_meta(get_the_ID(), ‘actress_awards_count’, true);
$fan_rating = get_post_meta(get_the_ID(), ‘actress_fan_rating’, true);
// 女優の画像
$image_url = get_the_post_thumbnail_url(get_the_ID(), ‘full’);
if (!$image_url) {
$image_url = plugins_url(‘assets/images/no-image.jpg’, dirname(__FILE__));
}
?>
<div class=”ranking-card”>
<div class=”ranking-rank rank-<?php echo $rank; ?>”><?php echo $rank; ?></div>
<div class=”ranking-image”>
<img src=”<?php echo esc_url($image_url); ?>” alt=”<?php the_title_attribute(); ?>”>
</div>
<div class=”ranking-content”>
<h2 class=”ranking-name”><?php the_title(); ?></h2>
<div class=”ranking-meta”>
<div class=”meta-item”><?php echo esc_html($age); ?>歳</div>
<div class=”meta-item”>T<?php echo esc_html($height); ?> / B<?php echo esc_html($bust); ?>(<?php echo esc_html($cup); ?>) / W<?php echo esc_html($waist); ?> / H<?php echo esc_html($hip); ?></div>
<div class=”meta-item”><?php echo esc_html($debut_year); ?>年デビュー</div>
</div>
<div class=”ranking-stats”>
<div class=”stat-item”>
<div class=”stat-value”><?php echo esc_html($works_count); ?></div>
<div class=”stat-label”>出演作品数</div>
</div>
<div class=”stat-item”>
<div class=”stat-value”><?php echo esc_html($followers); ?>万</div>
<div class=”stat-label”>SNSフォロワー</div>
</div>
<div class=”stat-item”>
<div class=”stat-value”><?php echo esc_html($awards_count); ?></div>
<div class=”stat-label”>受賞歴</div>
</div>
<div class=”stat-item”>
<div class=”stat-value”><?php echo esc_html($fan_rating); ?></div>
<div class=”stat-label”>ファン評価</div>
</div>
</div>
<div class=”ranking-desc”>
<?php the_content(); ?>
</div>
<div class=”tags”>
<?php
$tags = get_the_terms(get_the_ID(), ‘actress_tag’);
if ($tags && !is_wp_error($tags)) {
foreach ($tags as $tag) {
echo ‘<div class=”tag”>’ . esc_html($tag->name) . ‘</div>’;
}
}
?>
</div>
<!– 作品セクション –>
<div class=”works-section”>
<h3>人気作品</h3>
<div class=”works-grid”>
<?php
$works_args = array(
‘post_type’ => ‘av_work’,
‘posts_per_page’ => 3,
‘meta_query’ => array(
array(
‘key’ => ‘work_actress’,
‘value’ => get_the_ID(),
‘compare’ => ‘=’
)
),
‘meta_key’ => ‘work_release_date’,
‘orderby’ => ‘meta_value’,
‘order’ => ‘DESC’
);
$works_query = new WP_Query($works_args);
if ($works_query->have_posts()) :
while ($works_query->have_posts()) : $works_query->the_post();
$work_title = get_the_title();
$work_release_date = get_post_meta(get_the_ID(), ‘work_release_date’, true);
$work_image = get_the_post_thumbnail_url(get_the_ID(), ‘medium’);
$sample_url = get_post_meta(get_the_ID(), ‘work_sample_url’, true);
if (!$work_image) {
$work_image = plugins_url(‘assets/images/no-work-image.jpg’, dirname(__FILE__));
}
?>
<div class=”work-card”>
<div class=”work-image”>
<img src=”<?php echo esc_url($work_image); ?>” alt=”<?php echo esc_attr($work_title); ?>”>
</div>
<div class=”work-content”>
<div class=”work-title”><?php echo esc_html($work_title); ?></div>
<div class=”work-date”><?php echo date_i18n(‘Y年n月’, strtotime($work_release_date)); ?></div>
<?php if ($sample_url) : ?>
<a href=”<?php echo esc_url($sample_url); ?>” class=”sample-link” target=”_blank”>サンプル動画</a>
<?php endif; ?>
</div>
</div>
<?php
endwhile;
wp_reset_postdata();
else :
echo ‘<p>作品情報がありません</p>’;
endif;
?>
</div>
</div>
</div>
</div>
<?php
$rank++; // ランクを増加
endwhile;
wp_reset_postdata();
else :
echo ‘<p>女優情報がありません</p>’;
endif;
?>
</div>
<!– まとめセクション –>
<?php if (get_post_meta(get_the_ID(), ‘ranking_summary’, true)) : ?>
<div class=”summary-section”>
<h2>ランキングまとめ</h2>
<div class=”summary-content”>
<?php echo wpautop(get_post_meta(get_the_ID(), ‘ranking_summary’, true)); ?>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
<style>
:root {
–primary-color: #ff758f;
–secondary-color: #6c63ff;
–accent-color: #ff4757;
–text-color: #2d3436;
–light-gray: #f1f2f6;
–medium-gray: #a4b0be;
–dark-gray: #57606f;
–card-shadow: 0 10px 20px rgba(0,0,0,0.05);
–gradient-bg: linear-gradient(135deg, #ff758f 0%, #6c63ff 100%);
–rank1-color: #ffd700;
–rank2-color: #c0c0c0;
–rank3-color: #cd7f32;
}
.av-ranking-wrapper {
font-family: inherit;
line-height: 1.7;
color: var(–text-color);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.ranking-header {
background: var(–gradient-bg);
color: white;
padding: 80px 0;
text-align: center;
margin-bottom: 50px;
}
.ranking-title {
font-size: 2.5rem;
margin-bottom: 20px;
}
.ranking-description {
font-size: 1.2rem;
max-width: 800px;
margin: 0 auto 20px;
opacity: 0.9;
}
.ranking-meta {
font-size: 0.9rem;
opacity: 0.8;
}
.ranking-intro {
margin-bottom: 50px;
font-size: 1.1rem;
color: var(–dark-gray);
}
.ranking-list {
margin-bottom: 60px;
}
.ranking-card {
display: flex;
background: white;
margin-bottom: 30px;
border-radius: 15px;
overflow: hidden;
box-shadow: var(–card-shadow);
position: relative;
transition: all 0.3s ease;
}
.ranking-card:hover {
transform: translateY(-5px);
box-shadow: 0 15px 30px rgba(0,0,0,0.1);
}
.ranking-rank {
position: absolute;
top: 20px;
left: 20px;
width: 40px;
height: 40px;
background: var(–secondary-color);
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 1.2rem;
z-index: 2;
box-shadow: 0 5px 10px rgba(0,0,0,0.1);
}
.rank-1 {
background-color: var(–rank1-color);
width: 50px;
height: 50px;
font-size: 1.5rem;
}
.rank-2 {
background-color: var(–rank2-color);
width: 45px;
height: 45px;
font-size: 1.3rem;
}
.rank-3 {
background-color: var(–rank3-color);
width: 45px;
height: 45px;
font-size: 1.3rem;
}
.ranking-image {
flex: 0 0 280px;
position: relative;
overflow: hidden;
}
.ranking-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s ease;
}
.ranking-card:hover .ranking-image img {
transform: scale(1.05);
}
.ranking-content {
flex: 1;
padding: 30px;
}
.ranking-name {
font-size: 1.8rem;
font-weight: 700;
margin-bottom: 10px;
}
.ranking-meta {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin-bottom: 15px;
color: var(–medium-gray);
font-size: 0.95rem;
}
.ranking-stats {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
.stat-item {
background-color: var(–light-gray);
padding: 10px 15px;
border-radius: 10px;
text-align: center;
}
.stat-value {
font-size: 1.5rem;
font-weight: 700;
color: var(–accent-color);
}
.stat-label {
font-size: 0.8rem;
color: var(–dark-gray);
}
.ranking-desc {
margin-bottom: 20px;
line-height: 1.6;
}
.tags {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 20px;
}
.tag {
background-color: rgba(108, 99, 255, 0.1);
color: var(–secondary-color);
padding: 5px 15px;
border-radius: 30px;
font-size: 0.85rem;
}
.works-section {
margin-top: 20px;
}
.works-section h3 {
font-size: 1.2rem;
font-weight: 600;
margin-bottom: 15px;
position: relative;
padding-left: 15px;
}
.works-section h3::before {
content: ”;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 8px;
height: 20px;
background: var(–primary-color);
border-radius: 4px;
}
.works-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 15px;
}
.work-card {
background-color: white;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 5px 15px rgba(0,0,0,0.05);
transition: all 0.3s ease;
}
.work-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
}
.work-image {
height: 220px;
overflow: hidden;
}
.work-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s ease;
}
.work-card:hover .work-image img {
transform: scale(1.05);
}
.work-content {
padding: 15px;
}
.work-title {
font-size: 0.9rem;
font-weight: 600;
margin-bottom: 8px;
line-height: 1.4;
height: 2.5em;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.work-date {
color: var(–medium-gray);
font-size: 0.8rem;
margin-bottom: 10px;
}
.sample-link {
display: block;
text-align: center;
background-color: var(–light-gray);
color: var(–dark-gray);
padding: 5px 0;
border-radius: 5px;
font-size: 0.8rem;
transition: all 0.3s ease;
}
.sample-link:hover {
background-color: var(–secondary-color);
color: white;
}
.summary-section {
background-color: var(–light-gray);
padding: 40px;
border-radius: 15px;
margin-bottom: 50px;
}
.summary-section h2 {
font-size: 1.8rem;
margin-bottom: 20px;
text-align: center;
}
@media (max-width: 992px) {
.ranking-card {
flex-direction: column;
}
.ranking-image {
height: 300px;
flex-basis: auto;
}
}
@media (max-width: 768px) {
.ranking-title {
font-size: 2rem;
}
.ranking-name {
font-size: 1.5rem;
}
.ranking-stats {
flex-wrap: wrap;
}
.works-grid {
grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
}
.work-image {
height: 180px;
}
.summary-section {
padding: 25px;
}
}
@media (max-width: 576px) {
.ranking-header {
padding: 50px 0;
}
.ranking-rank {
top: 10px;
left: 10px;
}
.ranking-content {
padding: 20px;
}
.ranking-stats {
gap: 10px;
}
.stat-item {
padding: 8px 12px;
}
.stat-value {
font-size: 1.2rem;
}
.works-grid {
grid-template-columns: repeat(2, 1fr);
}
}
</style>
<?php get_footer(); // フッターを読み込み ?>