Celui que vous avez appelé avec get_template_part()
(ou locate_template()
) est un moyen de savoir dans quel modèle vous vous trouvez.
Par exemple, si vous appelez get_template_part('loop','archive');
à partir de archive.php
puis travaillez dans votre fichier loop-archive.php. Existe-t-il un moyen de définir une variable qui porte le nom de la partie de modèle en cours…. Donc $template = 'loop-archive'
. Mieux encore, peut-être en deux parties, donc 'boucle' et 'archive', mais je peux le faire avec un fractionnement de chaîne.
La question n ° 10537 semble en quelque sorte liée mais ne semble pas couvrir le modèle parts .
Aucune variable globale principale ne renvoie le contexte actuel. Cependant, vous pouvez créer les vôtres, en utilisant des balises conditionnelles contextuelles template . Vous pouvez parcourir les balises conditionnelles dans le même ordre que WordPress en suivant wp-includes/template-loader.php
.
Emballez simplement votre sortie dans une fonction de thème personnalisée. Voici comment je le fais (note: je ne pense pas suivre strictement le modèle template-loader.php):
function oenology_get_context() {
$context = 'index';
if ( is_home() ) {
// Blog Posts Index
$context = 'home';
if ( is_front_page() ) {
// Front Page
$context = 'front-page';
}
}else if ( is_date() ) {
// Date Archive Index
$context = 'date';
} else if ( is_author() ) {
// Author Archive Index
$context = 'author';
} else if ( is_category() ) {
// Category Archive Index
$context = 'category';
} else if ( is_tag() ) {
// Tag Archive Index
$context = 'tag';
} else if ( is_tax() ) {
// Taxonomy Archive Index
$context = 'taxonomy';
} else if ( is_archive() ) {
// Archive Index
$context = 'archive';
} else if ( is_search() ) {
// Search Results Page
$context = 'search';
} else if ( is_404() ) {
// Error 404 Page
$context = '404';
} else if ( is_attachment() ) {
// Attachment Page
$context = 'attachment';
} else if ( is_single() ) {
// Single Blog Post
$context = 'single';
} else if ( is_page() ) {
// Static Page
$context = 'page';
}
return $context;
}
Ensuite, je passe simplement oenology_get_context()
en tant que paramètre, par exemple:
get_template_part( 'loop', oenology_get_context() );
Je pense que quelque chose dans ce sens serait un bon candidat pour le noyau, bien que je ne sois pas sûr de la meilleure façon de la mettre en œuvre. J'aimerais bien soumettre un patch, cependant.
un peu un facepalm, parce que la réponse est en PHP pur
$path_parts = pathinfo(__FILE__);
//var_dump($path_parts);
echo $path_parts['filename'];
true
Comme toutes les fonctions is_*()
ont leur équivalent dans une variable de requête (les fonctions ne sont que des wrappers), vous pouvez également y accéder d'une autre manière: Obtenez simplement tout ce qui est true
.
J'ai écrit un ticket sur core/trac qui ajoute une fonction pour les lister tous.
En attendant, vous pouvez utiliser les deux fonctions listées en tant que plugins auxiliaires vous indiquant sur quelle requête la condition est disponible. Il imprimera une var_dump()
en dessous du pied de page (à la fois admin et public) à la page shutdown
.
<?php
/** Plugin Name: (#62232) »kaiser« List all conditionals that are true */
function get_conditionals()
{
global $wp_query;
foreach ( get_object_vars( $wp_query ) as $is_key => $is_value )
{
if ( $is_value && preg_match( "/is_/", $is_key ) )
$conditionals[] = $is_key;
}
return var_dump( $conditionals );
}
add_action( 'shutdown', 'get_conditionals' );
De cette façon, vous pouvez simplement les parcourir en boucle.
@scribu a ajouté sa propre fonction au ticket (une solution intéressante aussi).
<?php
/** Plugin Name: (#62232) »scribu« List all conditionals that are true */
function get_query_flags( $wp_query = null ) {
if ( !$wp_query )
$wp_query = $GLOBALS['wp_query'];
$flags = array();
foreach ( get_object_vars( $wp_query ) as $key => $val ) {
if ( 'is_' == substr( $key, 0, 3 ) && $val )
$flags[] = substr( $key, 3 );
}
return var_dump( $flags );
}
add_action( 'shutdown', 'get_query_flags' );
J'ai exécuté un test de performance sur chaque fonction au milieu d'un modèle à l'aide de timer_start/*_stop();
. Pour être honnête, j'ai renommé toutes les fonctions en un nom de caractère a/b/c()
.
Comme vous pouvez le constater, la fonction codée en dur de Chips est la plus rapide, puis la mienne est la dernière dans ce cas, scribus.
Si vous me connaissez, vous connaissez mon amour pour les itérateurs pour leur élégance, leur clarté et leur capacité à ne garder qu'un seul élément en mémoire au lieu de copier tout un tableau en boucle. Voici donc une classe personnalisée rapide qui étend un \FilterIterator
, n’ayant donc besoin que d’une seule méthode retravaillée.
<?php
namespace WPSE;
class ConditionalsFilter extends \FilterIterator
{
/**
* Accepts properties that start with `is_` and have a positive boolean value
* @return bool
*/
public function accept()
{
return 0 === strncasecmp( $this->key(), 'is_', 3 )
and filter_var(
$this->current(),
FILTER_VALIDATE_BOOLEAN,
FILTER_NULL_ON_FAILURE
);
}
}
Il peut être utilisé assez facilement. $it->current()
contient la valeur, alors que $it->key()
renvoie le nom conditionnel/propriété.
$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
var_dump(
$cond->key(),
$cond->current()
);
}
Si vous regardez le code source de la fonction get_template_part
, vous verrez:
function get_template_part( $slug, $name = null ) {
do_action( "get_template_part_{$slug}", $slug, $name );
$templates = array();
if ( isset($name) )
$templates[] = "{$slug}-{$name}.php";
$templates[] = "{$slug}.php";
locate_template($templates, true, false);
}
Il crée un tableau de 2 noms de modèles: {$slug}-{$name}.php
et {$slug}.php
et utilisez load_template
pour rechercher le fichier de modèle et l'inclure (le deuxième paramètre est true
, ce qui signifie inclure ce fichier).
Vous pouvez imiter cette fonction pour renvoyer le chemin du fichier de modèle au lieu de l'inclure, par exemple:
function my_get_template_part( $slug, $name = null, $include = false ) {
do_action( "get_template_part_{$slug}", $slug, $name );
$templates = array();
if ( isset($name) )
$templates[] = "{$slug}-{$name}.php";
$templates[] = "{$slug}.php";
return locate_template($templates, $include, false);
}
Usage:
// Don't load the template
$template = my_get_template_part( 'loop', 'archive', false );
// Or load the template
$template = my_get_template_part( 'loop', 'archive', true );
// Get the file name only
$template = basename( $template );
// Without .php extension
$template = substr( $template, 0, -4 );
Vous pouvez jouer plus avec $template
pour obtenir ce que vous voulez.