【问题标题】:Wordpress plugin development - Load the enqueued files only where we need themWordpress 插件开发 - 仅在我们需要的地方加载入队文件
【发布时间】:2025-12-14 23:30:03
【问题描述】:

我已经开发了 2 个 Wordpress 插件,我正在尝试仅在我需要的地方加载所需的 css 和 js 文件。

我写了一个函数:

function ds_shortcodes_enqueue() {

$shortcodes_pages = array(
    "shortcodes_plugin",
    "add_shortcode",
    "edit_shortcode"
);
$the_page = isset($_GET['page']);
if(in_array($the_page,$shortcodes_pages)){

    // enqueue all our scripts
    wp_enqueue_style( 'ds-shortcodes-style', plugins_url( '/admin/css/shortcodes-style.css', __FILE__ ) );

    wp_enqueue_script( 'ds-shortcodes-script', plugins_url( '/admin/js/shortcodes-scripts.js', __FILE__ ) );

    }
}
add_action( 'admin_enqueue_scripts', 'ds_shortcodes_enqueue' );

该函数应仅在具有数组中提到的 slug 的页面上加载文件。

然后,我编写了第二个插件。不同的名称,不同的文本域,不同的功能,我使用了相同的功能:

function ds_videos_enqueue() {

$videos_pages = array(
  "videos_plugin",
  "add_video",
  "edit_video",
  "edit_video_category",
  "video_categories",
  "edit_video_level",
  "video_levels",
  "video_shortcode"
);
$current_page = isset($_GET['page']);
if(in_array($current_page,$videos_pages)){
    wp_enqueue_style( 'ds-videos-style', plugins_url( '/admin/css/videos-style.css', __FILE__ ) );

    wp_enqueue_script( 'ds-videos-script', plugins_url( '/admin/js/videos-scripts.js', __FILE__ ) );
    }
}
add_action( 'admin_enqueue_scripts', 'ds_videos_enqueue' );

现在问题来了。

他们在管理员的任何插件页面上从两个插件加载文件。

我只是不明白。

我找不到任何方法来解决这个问题。

似乎 in_array() 总是返回 true。

希望你能帮忙。

谢谢。

【问题讨论】:

  • 你在管理页面加载?
  • 是的。仅在管理员中。它有效。但他们到处加载。它们应该只加载到数组中列出的页面上。

标签: wordpress enqueue


【解决方案1】:

admin_enqueue_scripts 将页面挂钩传递给回调函数。 所以,你可以做这样的事情,

function ds_shortcodes_enqueue($hook) {
    if($hook != 'page_where_you_want_scripts') {
        return;
    }
    wp_enqueue_style( 'ds-shortcodes-style', plugins_url( '/admin/css/shortcodes-style.css', __FILE__ ) );
    wp_enqueue_script( 'ds-shortcodes-script', plugins_url( '/admin/js/shortcodes-scripts.js', __FILE__ ) );
}
add_action( 'admin_enqueue_scripts', 'ds_shortcodes_enqueue' );

Reference

【讨论】:

  • 嗨。我必须在多个页面上显示它。我使用 in_array() 搜索数组,但它总是返回 true。
【解决方案2】:

我也试过这个,但 in_array 似乎不起作用。

function ds_shortcodes_enqueue() {

    $shortcodes_pages = array(
      "shortcodes_plugin",
      "add_shortcode",
      "edit_shortcode"
    );

    if(in_array("shortcodes_plugin", $shortcodes_pages)){

    // enqueue all our scripts
    wp_enqueue_style( 'ds-shortcodes-style', plugins_url( '/admin/css/shortcodes-style.css', __FILE__ ) );

   wp_enqueue_script( 'ds-shortcodes-script', plugins_url( '/admin/js/shortcodes-scripts.js', __FILE__ ) );

}
add_action( 'admin_enqueue_scripts', 'ds_shortcodes_enqueue' );

它应该只在页面上使用 slug“shortcodes_plugin”将 2 个文件排入队列。它会在任何地方加载文件。

【讨论】:

    【解决方案3】:

    wp-admin 中有一个名为 $pagenow 的全局变量,它保存当前页面的名称,即 edit.php、post.php 等。

    您还可以检查 $_GET 请求以进一步缩小您的位置,例如:

    function ds_shortcodes_enqueue() {
    
    $shortcodes_pages = array(
        "shortcodes_plugin",
        "add_shortcode",
        "edit_shortcode"
    );
    if ( isset($_GET['page']) ) {
        global $pagenow;
    if(in_array($pagenow,$shortcodes_pages)){
    
    
        // enqueue all our scripts
        wp_enqueue_style( 'ds-shortcodes-style', plugins_url( '/admin/css/shortcodes-style.css', __FILE__ ) );
    
        wp_enqueue_script( 'ds-shortcodes-script', plugins_url( '/admin/js/shortcodes-scripts.js', __FILE__ ) );
    
        }
        }
    }
    add_action( 'admin_enqueue_scripts', 'ds_shortcodes_enqueue' );
    
    
    
    
    function ds_videos_enqueue() {
    
    $videos_pages = array(
      "videos_plugin",
      "add_video",
      "edit_video",
      "edit_video_category",
      "video_categories",
      "edit_video_level",
      "video_levels",
      "video_shortcode"
    );
    if ( isset($_GET['page']) ) {
        global $pagenow;
    if(in_array($pagenow,$videos_pages)){
        wp_enqueue_style( 'ds-videos-style', plugins_url( '/admin/css/videos-style.css', __FILE__ ) );
    
        wp_enqueue_script( 'ds-videos-script', plugins_url( '/admin/js/videos-scripts.js', __FILE__ ) );
        }
    }
    }
    add_action( 'admin_enqueue_scripts', 'ds_videos_enqueue' );
    

    似乎 in_array() 总是返回 true。

    <?php 
    
    $videos_pages = array(
      'videos_plugin',
      'add_video',
      'edit_video',
      'edit_video_category',
      'video_categories',
      'edit_video_level',
      'video_levels',
      'video_shortcode'
    );
    $current_page = isset($_GET['page']);
    if(in_array($current_page,$videos_pages,true)){
        echo 'I am debug point';
    }else{
        echo 'I am debug point 2';
    }
    
    exit;
    ?>
    

    【讨论】:

    • 嗨。感谢您的快速回复。我已经尝试过了,它不再将任何文件排入队列。
    • 我刚刚注意到这些文件也正在加载到管理员的其他插件页面上。 in_array() 总是返回 true。
    • 哪里有问题?