web-dev-qa-db-fra.com

Existe-t-il un moyen d'obtenir le nom ou le bloc de parties de modèle utilisées dans une page?

Je développe un plugin personnalisé dans lequel j'utilise un modèle de page unique et modifie les parties du modèle uniquement à l'aide d'ajax. Je souhaite récupérer les slugs ou les noms de parties du modèle (par exemple, custom-header.php, custom-footer.php, custom-sidebar .php, custom-profile.php, etc.).

Est-il possible d'obtenir tous les noms de pièces de modèle utilisés dans une page?

quelque chose comme get_included_files() nous ne pouvons pas l'utiliser dans wordpress car il peut contenir des centaines de fichiers inclus. Pour moi, il s'agit de 156: P et tableau non assosiatif: P

1

Vous pouvez filtrer les chemins d'inclusion renvoyés par get_included_files en supprimant de la liste les fichiers qui ne figurent pas dans votre répertoire theme (et/ou thème enfant):

function get_theme_includes() {

    $includedfiles = get_included_files();
    // normalize theme paths for matching
    $styledir = str_replace("\\","/",get_stylesheet_directory());
    $templatedir = str_replace("\\","/",get_template_directory());

    $i = 0; // loop included files
    foreach ($includedfiles as $includedfile) {
        // normalize include path for match
        $includedfile = str_replace("\\","/",$includedfile);
        // check if included file is in stylesheet directory
        if (substr($includedfile,0,strlen($styledir)) != $styledir) {
            // if stylesheet is same as template, not a child theme
            if ($styledir == $templatedir) {unset($includedfiles[$vi]);}
            else {
                // check if included file is in template directory
                if (substr($includedfile,0,strlen($templatedir)) != $templatedir) {unset($includedfiles[$i]);}
                else {
                    // strip template directory from include path
                    $pathinfo = pathinfo(str_replace(dirname($templatedir),'',$includedfile));
                    // add filename.php => pathinfo array to the template array
                    $themeincludes[$pathinfo['basename']] = $pathinfo;
                }
            }
        } else {
            // strip stylesheet dir from include path
            $pathinfo = pathinfo(str_replace(dirname($styledir),'',$includedfile));
            // add filename.php => pathinfo array to the template array
            $themeincludes[$pathinfo['basename']] = $pathinfo;
        }
        $i++;
    }
    return $themeincludes;
}

En fonction de lorsque cette fonction est exécutée, mais vous obtiendrez des résultats différents, vous pourrez l'utiliser à votre avantage pour supprimer davantage les inclusions de thème antérieures, car celles-ci ne sont probablement pas compatibles. un modèle de page.

add_action('wp_loaded','check_theme_includes');
add_action('wp_footer','check_theme_templates');

function check_theme_includes() {
    global $themeincludes; $themeincludes = get_theme_includes();
}

function check_theme_templates() {
    global $themeincludes, $templateincludes;
    $templateincludes = get_theme_includes();

    // strip out already included theme files from template list
    foreach ($templateincludes as $template => $pathinfo) {
        if (array_key_exists($template,$themeincludes)) {
            if ($pathinfo['dirname'] == $themeincludes[$template]['dirname']) {
                unset($templateincludes[$template]);
            }
        }
    }

    // debug point
    // echo "<!-- INCLUDED TEMPLATES: "; print_r($templateincludes); echo "-->";

   // output template array for use by jquery/ajax
   echo "<script>var templatenames = new Array(); var templatepaths = new Array(); ";
   $i = 0;
   foreach ($templateincludes as $template => $pathinfo) {
       // optionally strip the .php extension
       $template = str_replace('.php','',$template);
       // output the template array key/value
       echo "templatenames[".$i."] = '".$pathinfo['filename']."'; ";
       echo "templatepaths[".$i."] = '".$pathinfo['dirname']."'; ";
       $i++;
   }
   echo "</script>";
}

Ce qui par exemple donnerait quelque chose comme ceci dans votre pied de page:

<script>var templatenames = new Array(); var templatepaths = new Array(); templatenames[0] = 'front'; templatepaths[0] = '/bioship/sidebar'; templatenames[1] = 'subfront'; templatepaths[1] = '/bioship/sidebar'; templatenames[2] = 'index'; templatepaths[2] = '/bioship'; templatenames[3] = 'header'; templatepaths[3] = '/bioship/sidebar'; templatenames[4] = 'loop-hybrid'; templatepaths[4] = '/bioship'; templatenames[5] = 'content'; templatepaths[5] = '/bioship/content'; templatenames[6] = 'loop-nav'; templatepaths[6] = '/bioship/content'; templatenames[7] = 'footer'; templatepaths[7] = '/bioship/sidebar'; </script>

Ce qui vous permettrait de comparer ces tableaux et d’y ajouter des rappels jQuery/javascript.

2
majick