How to point “add_menu_page” to HTML file rather than PHP function

I added a new menu item for my plugin like this:

add_menu_page(
  'Control Panel',
  'My Plugin',
  'manage_options',
  'control-panel',
  array($this, 'control_panel_page'),
  plugins_url('/images/menu_icon.png', __FILE__)
);

public function control_panel_page() {
  // My HTML goes here
}

However, I feel uncomfortable with the fact that all my HTML resides in PHP function (control_panel_page).

Read More

Is there an option/hack to point to HTML file rather than PHP function?

Related posts

Leave a Reply

2 comments

  1. From the codex page:

    $menu_slug
    (string) (required) The slug name to refer to this menu by (should be unique for this menu). Prior to Version 3.0 this was called the file (or handle) parameter. If the function parameter is omitted, the menu_slug should be the PHP file that handles the display of the menu page content.
    Default: None

  2. You can use the file_get_contents() function to load a file into a string and write it’s contents.

    It doesn’t exactly replaces the function with the file, but if your point in question is to have separate PHP file for the plugin logic, and another for the “HTML” page, than this should help.

    The following code is enough to response the content of a “HTML” or any other text file rather than echoing from the PHP code. Plugin consists of two files:

    • file.php
    • hello.html

    file.php

    <?php
    /*
    Plugin Name: HTML Include Plugin
    Version: 1.0
    */
    
    if(is_admin())
    {
        // register menu item
        add_action('admin_menu', 'admin_menu_item');    
    }
    
    function admin_menu_item()
    {
        // add menu item
        add_menu_page('HTML Include Plugin', 'HTML Include Plugin', 'manage_options', 'html-include-plugin', 'admin_page');
    }
    
    function admin_page()
    {
        // write the contents of the HTML file
        $file = file_get_contents('hello.html', FILE_USE_INCLUDE_PATH);
        if($file == false)
        {
            echo 'file not found';
        }
        else
        {
            echo $file;
        }
    }
    
    ?>
    

    hello.html

    <h1>Title</h1>
    <p>
        This is a sample HTML content, but this can be any kind of text file...
    </p>