web-dev-qa-db-ja.com

Iframe Thickboxのカスタム管理画面のエラー

私はiframeに新しい管理画面を追加するプラグインを持っています。私は自分のプラグインにPHPファイルを作成し、それにThickboxクラスのリンクを張った。すべてうまく動作しますが、WP_DEBUGがtrueに設定されているとPHPエラーが発生します。 WordPressのソースコードを見ると、/wp-admin/の外側から直接PHPをiframeに入れてもエラーを回避する方法はありません。

Notice:未定義のオフセット:28行目の.../wp-includes/vars.phpに1

これは、WordPressが$ pagenow変数を設定するためにファイル名を抽出するためにWebアドレスで正規表現を実行しているために発生しますが、ファイルは/ wp-admin /にあると想定されます。そうではないので、一致はありません。

これが プラグインです 。ファイルはchildren.phpです。

/wp-admin/ファイルを実行するiframe Thickboxに含めることができるカスタム管理画面を作成するためのより良い方法はありますか?

3
Randy Hoyt

興味深い質問です。
調べてみると、同じDion Hulseによる [wp-hackers]スレッド が見つかりました。

まず、thickboxに別の管理者ページを開く簡単なリンクを持つテストページ。

add_action('admin_menu', 'wpse_71437_admin_submenu');

function wpse_71437_admin_submenu() 
{
    add_menu_page(
        'TB', 
        '<span style="color:#e57300;">Thickbox</span>', 
        'edit_pages', 
        'open_hidden_page_in_thickbox', 
        'wpse_71437_submenu_page',
        '', // no icon
        1 // create before Dashboard menu item
    );
}

function wpse_71437_submenu_page() 
{
    wp_enqueue_style('thickbox');
    wp_enqueue_script('thickbox');
    ?>
    <div id="icon-upload" class="icon32"></div><h2>Thickbox</h2>
    <br><br>
    <a href="#" id="open-tb">Click Here</a>

    <script type="text/javascript">
    jQuery(document).ready(function() {   
        jQuery("#open-tb").click(function() {                 
            tb_show("", "index.php?page=video_page_hidden&TB_iframe=true");
            return false;
        });
    });             
    </script>
    <?php
}

これで、thickboxで開かれるページです。その親はnullとして定義されているので、メニューには表示されません。そして、直接アクセスした場合には何も現れないので、コールバックは空の関数です。

/**
 * Add a hidden and empty submenu page
 */
add_action('admin_menu', 'wpse_71437_admin_menu');

function wpse_71437_admin_menu() 
{
    add_submenu_page(
        null, // doesn't show up in the menu, attached to "index.php" (not sure why)
        'Video', 
        'Video', 
        'edit_pages', 
        'video_page_hidden', 
        'wpse_71437_menu_options'
    );
}

function wpse_71437_menu_options() { /* Print nothing */ }

そして最後に、トリック!
隠されたページのロードを傍受して、いくつかのiframeの内容を印刷します。

/**
 * Intercept our hidden/empty page and print the Thickbox content
 */
add_action( 'load-dashboard_page_video_page_hidden', 'wpse_71437_intercept_thickbox' ); 

function wpse_71437_intercept_thickbox() 
{ 
    iframe_header(); 
    echo '<iframe width="100%" height="380px" src="http://www.youtube.com/embed/cL6qe0b-_BA" frameborder="0" allowfullscreen></iframe>';
    iframe_footer(); 
    exit; //Die to prevent the page continueing loading and adding the admin menu's etc. 
}
2
brasofilo