Files
wp-asciiplayer/includes/assets.php
T
LamGC f04600c37b Refresh player with native block editor preview and local assets
Preserve shortcode rendering, normalize options, bundle the player locally,
and add reproducible packaging and WordPress integration tests.
2026-10-12 17:56:08 +08:00

115 lines
3.8 KiB
PHP

<?php
/**
* Locally bundled, shared player assets and block registration.
*
* @package LamGC\Asciiplayer
*/
namespace LamGC\Asciiplayer;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Register the block, shortcode and all plugin-scoped asset handles.
*
* @return void
*/
function register_plugin() {
$base = plugin_dir_url( PLUGIN_FILE ) . 'build/';
$asset = array(
'dependencies' => array( 'wp-blocks', 'wp-element', 'wp-block-editor', 'wp-components', 'wp-i18n' ),
'version' => VERSION,
);
if ( file_exists( dirname( PLUGIN_FILE ) . '/build/index.asset.php' ) ) {
$asset = require dirname( PLUGIN_FILE ) . '/build/index.asset.php';
}
$view_asset = array( 'dependencies' => array( 'wp-i18n' ), 'version' => VERSION );
if ( file_exists( dirname( PLUGIN_FILE ) . '/build/view.asset.php' ) ) {
$view_asset = require dirname( PLUGIN_FILE ) . '/build/view.asset.php';
}
wp_register_script( 'lamgc-asciiplayer-player', $base . 'player.js', array(), VERSION, true );
wp_register_script(
'lamgc-asciiplayer-view',
$base . 'view.js',
array_unique( array_merge( $view_asset['dependencies'], array( 'lamgc-asciiplayer-player' ) ) ),
$view_asset['version'],
true
);
wp_register_script(
'lamgc-asciiplayer-editor',
$base . 'index.js',
array_unique( array_merge( $asset['dependencies'], array( 'lamgc-asciiplayer-player' ) ) ),
$asset['version'],
true
);
wp_register_style( 'lamgc-asciiplayer-player-style', $base . 'player.css', array(), VERSION );
wp_register_style( 'lamgc-asciiplayer-style', $base . 'style-index.css', array( 'lamgc-asciiplayer-player-style' ), VERSION );
wp_register_style( 'lamgc-asciiplayer-editor-style', $base . 'index.css', array( 'lamgc-asciiplayer-player-style' ), VERSION );
wp_add_inline_script(
'lamgc-asciiplayer-editor',
'window.wpAsciiplayerSettings = ' . wp_json_encode(
array(
'playerScriptUrl' => add_query_arg( 'ver', VERSION, $base . 'player.js' ),
'playerStyleUrl' => add_query_arg( 'ver', VERSION, $base . 'player.css' ),
),
JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
) . ';',
'before'
);
wp_set_script_translations( 'lamgc-asciiplayer-view', 'wp-asciiplayer', dirname( PLUGIN_FILE ) . '/languages' );
wp_set_script_translations( 'lamgc-asciiplayer-editor', 'wp-asciiplayer', dirname( PLUGIN_FILE ) . '/languages' );
register_block_type( dirname( PLUGIN_FILE ) . '/build', array( 'render_callback' => __NAMESPACE__ . '\\render_block' ) );
add_shortcode( SHORTCODE, __NAMESPACE__ . '\\render_shortcode' );
}
/**
* Enqueue in the shared renderer as well, for widgets and template calls.
* WordPress deduplicates handles across any number of players on a page.
*
* @return void
*/
function enqueue_player_assets() {
wp_enqueue_script( 'lamgc-asciiplayer-view' );
wp_enqueue_style( 'lamgc-asciiplayer-style' );
}
/**
* Look ahead before the head is printed, including Pages and archive results.
* Render-time enqueueing remains the source of truth for indirect content.
*
* @return void
*/
function enqueue_content_assets() {
global $wp_query;
if ( empty( $wp_query->posts ) || ! is_array( $wp_query->posts ) ) {
return;
}
foreach ( $wp_query->posts as $post ) {
if ( ! is_object( $post ) || ! isset( $post->post_content ) ) {
continue;
}
if ( has_shortcode( $post->post_content, SHORTCODE ) || has_block( 'lamgc/asciiplayer', $post->post_content ) ) {
enqueue_player_assets();
return;
}
}
}
/**
* Print only our late-enqueued CSS, before footer scripts initialize players.
* This covers dynamically rendered shortcodes in widgets and classic themes.
*
* @return void
*/
function print_late_styles() {
if ( wp_style_is( 'lamgc-asciiplayer-style', 'enqueued' ) && ! wp_style_is( 'lamgc-asciiplayer-style', 'done' ) ) {
wp_print_styles( array( 'lamgc-asciiplayer-style' ) );
}
}