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
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.