refactor: 聆韵改为列表直接播放模式——圆形按钮一键播放,无需跳转详情页

This commit is contained in:
2026-05-19 01:01:35 +08:00
parent d21487130b
commit b42d9eb859
3 changed files with 51 additions and 74 deletions
+41 -12
View File
@@ -18,22 +18,25 @@ $query = new WP_Query(array(
<?php if ($query->have_posts()) : ?>
<div class="music-list">
<?php while ($query->have_posts()) : $query->the_post(); ?>
<a href="<?php echo home_url("/?music=" . get_the_ID()); ?>" class="music-item">
<?php if (has_post_thumbnail()) : ?>
<div class="music-item__cover">
<?php the_post_thumbnail('thumbnail', array('alt' => get_the_title())); ?>
<span class="music-item__play">▶</span>
</div>
<?php else : ?>
<div class="music-item__cover music-item__cover--empty">
<span>🎵</span>
</div>
<?php endif; ?>
<div class="music-item">
<div class="music-item__cover" onclick="togglePlay(this)">
<span class="music-item__play-icon">▶</span>
</div>
<div class="music-item__body">
<span class="music-item__title"><?php the_title(); ?></span>
<span class="music-item__desc"><?php echo esc_html(wp_strip_all_tags(get_the_content())); ?></span>
<span class="music-item__author"><?php the_author_meta('display_name'); ?> · <?php echo get_the_date('Y-m-d'); ?></span>
</div>
</a>
<?php
// 从正文中提取 audio src
$content = get_the_content();
$audio_src = '';
if (preg_match('/<audio[^>]+src="([^"]+)"/', $content, $m)) {
$audio_src = $m[1];
}
?>
<audio class="music-item__audio" preload="none" src="<?php echo esc_url($audio_src); ?>" style="display:none"></audio>
</div>
<?php endwhile; ?>
</div>
<?php wp_reset_postdata(); ?>
@@ -44,4 +47,30 @@ $query = new WP_Query(array(
</div>
<?php endif; ?>
<script>
(function() {
var current = null;
window.togglePlay = function(el) {
var item = el.closest('.music-item');
var audio = item.querySelector('.music-item__audio');
var icon = el.querySelector('.music-item__play-icon');
if (!audio) return;
if (current && current !== audio) {
current.pause();
current.closest('.music-item').querySelector('.music-item__play-icon').textContent = '▶';
}
if (audio.paused) {
audio.play();
icon.textContent = '⏸';
} else {
audio.pause();
icon.textContent = '▶';
}
current = audio;
};
})();
</script>
<?php get_footer(); ?>
-43
View File
@@ -1,43 +0,0 @@
<?php get_header(); ?>
<?php while (have_posts()) : the_post(); ?>
<article class="music-detail">
<a href="/music/" class="back-link">← 返回聆韵</a>
<?php if (has_post_thumbnail()) : ?>
<div class="music-detail__cover">
<?php the_post_thumbnail('medium_large', array('alt' => get_the_title())); ?>
</div>
<?php endif; ?>
<h1 class="music-detail__title"><?php the_title(); ?></h1>
<div class="music-detail__meta">
<span><?php echo get_avatar(get_the_author_meta('ID'), 18); ?> <?php the_author_meta('display_name'); ?></span>
<span>&middot;</span>
<span><?php echo get_the_date('Y-m-d'); ?></span>
</div>
<div class="music-detail__body">
<?php the_content(); ?>
</div>
<?php
$left = get_adjacent_post(false, '', false);
$right = get_adjacent_post(false, '', true);
if ($left || $right) : ?>
<div class="music-detail__nav">
<?php if ($left) : ?>
<a href="<?php echo get_permalink($left); ?>">← <?php echo get_the_title($left); ?></a>
<?php else: ?>
<span></span>
<?php endif; ?>
<?php if ($right) : ?>
<a href="<?php echo get_permalink($right); ?>"><?php echo get_the_title($right); ?> →</a>
<?php endif; ?>
</div>
<?php endif; ?>
</article>
<?php endwhile; ?>
<?php get_footer(); ?>
+10 -19
View File
@@ -306,28 +306,19 @@ echo "done"
.gallery-empty { display:flex; align-items:center; justify-content:center; min-height:160px; color:var(--ink-lighter); background:linear-gradient(135deg, #faf7f0 0%, #f0ebe0 100%); }
/* ── 聆韵 ── */
.music-list { display:flex; flex-direction:column; gap:0; }
.music-item { display:flex; align-items:center; gap:16px; padding:18px 0; border-bottom:1px solid var(--border-light); text-decoration:none; color:inherit; transition:padding 0.25s; }
.music-item:hover { padding-left:8px; border-bottom-color:var(--cinnabar-light); }
.music-item__cover { width:60px; height:60px; border-radius:var(--radius); overflow:hidden; flex-shrink:0; position:relative; background:linear-gradient(135deg, #e8dccf 0%, #d5c4aa 100%); }
.music-item__cover img { width:100%; height:100%; object-fit:cover; }
.music-item__cover--empty { display:flex; align-items:center; justify-content:center; font-size:28px; }
.music-item__play { position:absolute; inset:0; display:flex; align-items:center; justify-content:center; background:rgba(0,0,0,0.3); color:#fff; font-size:20px; opacity:0; transition:opacity 0.2s; }
.music-item:hover .music-item__play { opacity:1; }
.music-item__body { display:flex; flex-direction:column; gap:4px; }
.music-item__title { font-size:16px; letter-spacing:0.05em; }
.music-item { display:flex; align-items:center; gap:16px; padding:18px 0; border-bottom:1px solid var(--border-light); }
.music-item__cover { width:56px; height:56px; border-radius:50%; flex-shrink:0; background:var(--cinnabar); display:flex; align-items:center; justify-content:center; cursor:pointer; transition:all 0.2s; }
.music-item__cover:hover { transform:scale(1.08); background:#a03a32; }
.music-item__play-icon { color:#fff; font-size:18px; margin-left:2px; }
.music-item__body { flex:1; min-width:0; display:flex; flex-direction:column; gap:3px; }
.music-item__title { font-size:16px; letter-spacing:0.05em; font-weight:600; }
.music-item__desc { font-size:13px; color:var(--ink-light); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.music-item__author { font-size:12px; color:var(--ink-lighter); }
.music-item__audio { display:none; }
.music-item.playing .music-item__cover { background:#2c2416; animation:pulse-cover 2s infinite; }
@keyframes pulse-cover { 0%,100% { box-shadow:0 0 0 0 rgba(181,67,58,0.4); } 50% { box-shadow:0 0 0 8px rgba(181,67,58,0); } }
.music-empty { display:flex; flex-direction:column; align-items:center; justify-content:center; min-height:160px; color:var(--ink-lighter); gap:12px; }
.music-empty__icon { font-size:48px; opacity:0.4; }
.music-detail { max-width:680px; margin:0 auto; }
.music-detail__cover { border-radius:var(--radius); overflow:hidden; margin-bottom:24px; }
.music-detail__cover img { width:100%; height:auto; display:block; }
.music-detail__title { font-size:24px; margin-bottom:12px; }
.music-detail__meta { display:flex; align-items:center; gap:8px; font-size:13px; color:var(--ink-lighter); margin-bottom:24px; }
.music-detail__body { font-size:15px; line-height:1.9; color:var(--ink); margin-bottom:32px; }
.music-detail__body audio, .music-detail__body video { width:100%; margin:16px 0; border-radius:var(--radius); }
.music-detail__nav { display:flex; justify-content:space-between; padding:24px 0; border-top:1px solid var(--border-light); }
.music-detail__nav a { color:var(--ink-light); text-decoration:none; font-size:14px; }
.music-detail__nav a:hover { color:var(--cinnabar); }
/* Card & pinned cover image constraints */