在 WordPress Puock 主题中集成 Meting.js 音乐播放器

209次阅读
2 条评论

共计 2703 个字符,预计需要花费 7 分钟才能阅读完成。

首先需要引入js,css文件,我是直接对源码进行修改,没有用子主题,因为自己也是初学,还没有搞的太明白,刚开始是直接在function.php中写了个方法进行引入,具体可以问一下AI,后面发现,每次切换页面都会载入,就搜了一下默认的js文件载入路径,在主题文件夹下/wordpress/wp-content/themes/puock/inc/init.php,我是这样添加的,需要自己修改为自己的js路径

        wp_enqueue_style('puock-aplayer', pk_get_static_url() . '/assets/libs/aplayer/APlayer.min.css', [], PUOCK_CUR_VER_STR);
        wp_enqueue_script('puock-aplayer', pk_get_static_url() . '/assets/libs/aplayer/APlayer.min.js', array(), PUOCK_CUR_VER_STR, true);
        wp_enqueue_script('puock-meting', pk_get_static_url() . '/assets/libs/aplayer/Meting.min.js', array('puock-aplayer'),PUOCK_CUR_VER_STR, true);

然后就是在function.php和footer.php添加方法和容器,其实中间踩了很多坑,比方说刚开始就没怎么看,以为用的pjax做的无刷,搜了半天错误的方法,都想放弃了,然后好好看了一下源码,哦原来是用instantClick,我想着change事件后用localStorage绑定一下播放状态,就可以了,当时的代码是这样的,但是有个问题,就是每次刷新页面,都会断一下,我他娘的直接强迫症犯了

function.php 添加方法

function pk_add_remember_music_script() {
    ?>
    <script>
        if (typeof window.ap === 'undefined') {
            window.ap = null;
        }

        function ready(){
            window.ap.on('canplay', function () {
                if(localStorage.getItem("musicIndex") != null){
                    musicIndex = localStorage.getItem("musicIndex");
                    musicTime = localStorage.getItem("musicTime");
                    if(window.ap.list.index != musicIndex){
                        window.ap.list.switch(musicIndex);
                    }else{
                        window.ap.seek(musicTime);
                        window.ap.play();
                        localStorage.clear();
                    }
                }
            });
        }

        Object.defineProperty(document.querySelector('meting-js'), "aplayer", {
            set: function (aplayer) {
                window.ap = aplayer;
                ready();
            }
        });

        if (typeof InstantClick !== 'undefined') {
            InstantClick.on('change', function(){
                if(!window.ap.audio.paused){
                    musicIndex = window.ap.list.index;
                    musicTime = window.ap.audio.currentTime;
                    localStorage.setItem("musicIndex",musicIndex);
                    localStorage.setItem("musicTime",musicTime);
                }
            });
        }
    </script>
    <?php
}
add_action('wp_footer', 'pk_add_remember_music_script');

footer.php 添加容器 注意别放到content里面 忘了会有什么问题了

<meting-js 
    server="netease"
    type="playlist"
    fixed="true"
    id="60198">
</meting-js>

 

后面才发现自己太蠢了,总之自己也是个前端大菜鸡,其实只需要保存meting.js初始化后的对象,然后appendChild就行了,都得定义成全局变量,不然会有冲突,具体怎么解决,希望其他大佬能帮帮俺,最终解决方案

function pk_add_remember_music_script() {
    ?>
    <script>
        if (typeof window.ap === 'undefined') {
            window.ap = null;
            window.mtjs = null;
        }
         if (window.mtjs) {
           document.body.appendChild(window.mtjs);
        }

        function ready(){
            if (!window.mtjs) {
                window.mtjs = document.querySelector('meting-js');
                console.log(window.mtjs);
            }
        }

        Object.defineProperty(document.querySelector('meting-js'), "aplayer", {
            set: function (aplayer) {
                window.ap = aplayer;
                ready();
            }
        });

    </script>
    <?php
}
add_action('wp_footer', 'pk_add_remember_music_script');

当然还有点问题,控制台一直报错,应该是metingjs默认的事件,我也懒得搞了,直接去

copy一份未压缩源码,替换掉Meting.min.js,修改js中最前面的两个方法,一个是根据全局变量判断是不是要加载列表,另外一个应该是销毁,我直接注释掉了,到此就成功实现了切换页面无中断播放

  connectedCallback() {
    if (!window.mtjs && window.APlayer && window.fetch) {
      this._init()
      this._parse()
    }
  }

  disconnectedCallback() {
    if (!this.lock) {
    //   this.aplayer.destroy()
    }
  }

正文完
 0
grbox
版权声明:本站原创文章,由 grbox 于2025-07-02发表,共计2703字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(2 条评论)
验证码
2025-07-03 11:47:00 回复

哇趣,这个可太棒了,正是我想要的,当年没研究下去

 iPhone  AppleWebKit  中国移动
    2025-07-03 21:56:37 回复

    前人栽树后人乘凉 :cool:

     Windows  Edge  中国广东省中山市电信