Wordpress 支持搜索 Mp3 附件
曾经想着有这么一个功能,就是输入搜索关键字,能搜索到相关的文章以及搜索到相关的 Mp3 附件,并且继承默认的显示方式显示出来,同时可以点击试听,而且歌曲杜绝同步播放,一次只能听一首歌,今天就实现了这个功能。在实现这个功能前有几个因素需要考虑:
- 搜索关键字匹配的文章和 Mp3 附件要按照原来的方式展现出来;
- 遵循原来的分页,在没有 Mp3 附件的情况下,展现文章的列表和分页保持不变,代码测试过程中就是因为搜索的关键字不包含 Mp3 歌曲的关键字,导致分页出现问题,设置每页 12 个文章,结果只显示一半的文章而已,后续修复;
- 杜绝多个歌曲同时播放,每点击一首歌曲,之前播放的歌曲马上停止,并且切换到原始未播放状态;
下面就针对这些问题,贴上我的代码:
1、设置插件,把下面的代码保存起来,上传到系统的插件文件夹,进入后台,开启激活插件:
<?php
/*
Plugin Name: Custom MP3 Attachment Search
Description: Enhance search functionality to include only mp3 attachments.
*/
function custom_mp3_attachment_search_filter($query) {
if ($query->is_search) {
$query->set('post_type', array('post', 'attachment')); // 仅搜索附件
$query->set('post_status', array('publish', 'inherit')); // 包括已发布和继承状态的附件
// 添加自定义的 meta 查询来检查附件的 MIME 类型
$meta_query = array(
'relation' => 'OR', // 使用 OR 关系
array(
'key' => '_wp_attachment_metadata',
'value' => 'audio/mpeg', // MIME 类型为 mp3
'compare' => 'LIKE',
),
array(
'key' => '_wp_attachment_metadata',
'compare' => 'NOT EXISTS', // 排除其他类型的附件
),
);
$query->set('meta_query', $meta_query);
$query->set('posts_per_page', 12); // 设置每页显示数量为 12
}
return $query;
}
add_filter('pre_get_posts', 'custom_mp3_attachment_search_filter');
function filter_attachments_in_search_results($posts) {
$filtered_posts = array();
foreach ($posts as $post) {
if ('attachment' !== $post->post_type || 'audio/mpeg' === get_post_mime_type($post->ID)) {
$filtered_posts[] = $post;
}
}
return $filtered_posts;
}
add_filter('the_posts', 'filter_attachments_in_search_results');
2、设置前端代码,给文章和附件添加一个判断,附件则以播放器形式调取路径进行播放:
if ($post->post_type === 'post') {
echo the_excerpt();
} elseif ($post->post_type === 'attachment') {
// 如果是附件类型,判断是否为 mp3 文件
$mime_type = get_post_mime_type();
if ('audio/mpeg' === $mime_type) {
// 输出 mp3 附件的链接或内容
$attachment_url = wp_get_attachment_url($post->ID);
$attachment_title = get_the_title($post->ID);
echo '<audio id="audio-' . $post->ID . '" controls><source src="' . $attachment_url . '" type="audio/mpeg"></audio>';
}
}
同时,在输出 mp3 附件的代码中,确保为每个音频元素添加一个独特的 id,以便 JavaScript 代码可以正确地识别它们:
3、添加 JavaScript 代码,控制歌曲播放器只允许同一时间只能播放一首歌曲,把代码放到 footer.php 中去,确保站点渲染速度:
<script>
//禁止同时播放多个音频
var audioElements = document.querySelectorAll('audio');
audioElements.forEach(function(audio) {
audio.addEventListener('play', function() {
pauseOtherAudios(audio);
});
});
function pauseOtherAudios(currentAudio) {
audioElements.forEach(function(audio) {
if (audio !== currentAudio) {
audio.pause();
audio.currentTime = 0;
}
});
}
</script>
至此,今天的代码就到此结束,欢迎大家交流指导!以上的前端修改代码请修改 search.php 文件,有的朋友用默认的 index.php 作为 search.php 使用,为了不影响主页,可以添加判断,判断是主页和搜索页,或者另外建立 search.php 进行使用。
Post On Aug 28, 2023 At 09:10:30 PM