2024 年 4 月 28 日 我的频道
Wordpress 支持搜索 Mp3 附件
  • 2023
  • Sunny

曾经想着有这么一个功能,就是输入搜索关键字,能搜索到相关的文章以及搜索到相关的 Mp3 附件,并且继承默认的显示方式显示出来,同时可以点击试听,而且歌曲杜绝同步播放,一次只能听一首歌,今天就实现了这个功能。在实现这个功能前有几个因素需要考虑:

  1. 搜索关键字匹配的文章和 Mp3 附件要按照原来的方式展现出来;
  2. 遵循原来的分页,在没有 Mp3 附件的情况下,展现文章的列表和分页保持不变,代码测试过程中就是因为搜索的关键字不包含 Mp3 歌曲的关键字,导致分页出现问题,设置每页 12 个文章,结果只显示一半的文章而已,后续修复;
  3. 杜绝多个歌曲同时播放,每点击一首歌曲,之前播放的歌曲马上停止,并且切换到原始未播放状态;

下面就针对这些问题,贴上我的代码:

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 进行使用。

STUDY
802
0

Author Box

名字:Sunny
注册:Jan 30, 2021
简介:技术菜鸟,拷贝、黏贴代码中 ……

Comment Box

5 1 投票
Article Rating
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论