web-dev-qa-db-fra.com

Erreur avec l'écran Admin personnalisé dans l'iframe Thickbox

J'ai un plugin qui ajoute un nouvel écran d'administration dans une iframe. J'ai créé un fichier PHP dans mon plugin, et j'ai mis un lien vers une classe de Thickbox. Tout fonctionne très bien, mais cela produit une erreur PHP lorsque WP_DEBUG est défini sur true. En regardant le code source de WordPress, il n’ya aucune solution au problème si je mets un PHP de l’extérieur /wp-admin/ directement dans une iframe.

Avis: Offset non défini: 1 dans .../wp-includes/vars.php à la ligne 28

Cela se produit parce que WordPress exécute regex sur l'adresse Web pour extraire le nom du fichier afin de définir la variable $ pagenow, mais suppose que le fichier sera dans/wp-admin /. Comme ce n'est pas le cas, il n'y a pas de correspondance.

Voici le plugin . Le fichier est children.php.

Existe-t-il un meilleur moyen de créer un écran d’administrateur personnalisé pouvant être inclus dans une iframe Thickbox s’exécutant dans un fichier /wp-admin/?

3
Randy Hoyt

Question interessante.
En recherchant cela, j'ai trouvé un fil [wp-hackers] du même Dion Hulse qui donne un peu plus d'informations.

Premièrement, une page de test avec un simple lien qui ouvrira une autre page d’administrateur dans une boîte épaisse.

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
}

Maintenant, la page qui sera ouverte dans la boîte à lettres. Son parent est défini comme null, ainsi il n'apparaît pas dans le menu. Et le rappel est une fonction vide, si on y accède directement, rien n’apparaît.

/**
 * 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 */ }

Et enfin, le truc!
Intercepter le chargement de la page masquée et imprimer du contenu 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