Quel code php peut être utilisé pour récupérer le nom de la page actuelle dans un thème WordPress?
Toutes les solutions que j'ai vues jusqu'à présent (the_title()
, get_page()->post_name
, get_post()
, etc.) ne fonctionnent pas pour une page contenant des entrées de publication. Ils renverront tous le nom de la dernière entrée de blog.
En d’autres termes, supposons que vous avez créé une page dans WordPress avec le nom "My News" . Cette page est définie comme "page de publication". Ajouter quelques articles à la page ..__ Maintenant, quelle API peut être utilisée pour récupérer la chaîne "my-news" à la place du nom de l'article le plus récent?
Modifier:
J'ai trouvé la variable suivante qui semble fonctionner.
$wp_query->queried_object->post_name
Il s’agit en fait de la version conviviale pour les URL du nom de la page (slug), ce que je recherchais aussi. Cela a été testé avec le modèle par défaut (vingt). Je ne sais vraiment pas pourquoi les deux variables ci-dessous ne fonctionnent pas sur mon site. Merci keatch pour le conseil print_r()
.
Maintenant, pourquoi cette information est-elle cachée si profondément?
La variable globale WP $pagename
devrait être disponible, je viens d’essayer avec la même configuration que celle que vous avez spécifiée.
$pagename
est défini dans le fichier wp-includes/theme.php, à l'intérieur de la fonction get_page_template()
, qui est bien sûr appelée avant que les fichiers de thème de page ne soient analysés. Il est donc disponible à tout moment dans vos modèles de pages.
MODIFIER:
Bien que cela ne semble pas documenté, la variable $pagename
var n'est définie que si vous utilisez des liens permanents. Je suppose que c’est parce que si vous ne les utilisez pas, WP n’a pas besoin du slug de page, il ne le configure donc pas.
$pagename
n'est pas défini si vous utilisez la page comme page de garde statique.
C'est le code à l'intérieur de /wp-includes/theme.php, qui utilise la solution que vous avez indiquée lorsque $pagename
ne peut pas être défini:
$pagename = get_query_var('pagename');
if ( !$pagename && $id > 0 ) {
// If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
$post = $wp_query->get_queried_object();
$pagename = $post->post_name;
}
Mon approche pour obtenir le nom de la limace de la page
$slug = basename(get_permalink());
Ok, vous devez saisir le titre de la page AVANT la boucle.
$page_title = $wp_query->post->post_title;
Vérifiez la référence: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .
Fait une
print_r($wp_query)
avant la boucle pour voir toutes les valeurs de l'objet $ wp_query
<?php wp_title(''); ?>
Cela a fonctionné pour moi, si je comprends bien, vous voulez obtenir le nom de la page sur une page qui a des entrées de publication?
Vous pouvez obtenir le type de page, publication ou publication en cours avec la variable globale $ post.
echo $post->post_title
Remarque: Dans une fonction ou une classe, vous devrez spécifier global $post;
avant d'essayer d'utiliser $ post.
Si vous avez des boucles sur votre page, assurez-vous de terminer chaque boucle avec wp_reset_postdata();
pour définir $ post sur l'élément par défaut affiché (la page).
Notez que la variable "post_title" est également disponible pour toute requête/boucle personnalisée .. y compris les éléments de menu et les pièces jointes multimédia .. tout dans WordPress est un "post".
Si vous souhaitez accéder à la page en cours depuis votre fichier functions.php (donc, avant la boucle, avant que $post
soit rempli, avant que $wp_query
soit initialisé, etc.), vous n'avez pas d'autre choix que de accéder aux variables du serveur elles-mêmes et extraire la page demandée à partir de la chaîne de requête.
$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )
Notez qu'il s'agit d'une solution "stupide". Il ne sait pas, par exemple, que la page avec le slug 'coming-soon' est aussi p=6
. Et cela suppose que vos paramètres de permalien soient définis sur pagename
(ce qu'ils devraient être de toute façon!).
Néanmoins, cela peut être un petit truc utile si vous avez un scénario contrôlé. J'utilise ceci dans une situation où je souhaite rediriger les visiteurs non-connectés vers une page "à venir"; mais je dois m'assurer que je ne les jette pas dans la redoutable "boucle de redirection", je dois donc exclure de la règle la page "coming soon":
global $pagenow;
if (
! is_admin() &&
'wp-login.php' != $pagenow &&
'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
! is_user_logged_in()
){
wp_safe_redirect( 'coming-soon' );
}
J'ai mis au point une solution plus simple.
Récupère la valeur renvoyée du nom de la page à partir de wp_title (), si vide, affiche le nom de la page d'accueil, sinon echo la valeur de wp_title.
<?php $title = wp_title('',false); ?>
N'oubliez pas de supprimer la séparation avec le premier argument, puis définissez display sur false pour l'utiliser comme entrée de la variable. Ensuite, il suffit de taper le code entre vos balises de titre, etc.
<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>
Travaillé un festin pour moi et en s'assurant que le premier est déclaré dans la section où vous souhaitez extraire le $ title, cela peut être réglé pour renvoyer différentes variables.
Essaye ça:
$pagename = get_query_var('pagename');
Nous avons juste besoin d'utiliser la variable globale "post".
global $post;
echo $post->post_title;
Cela fera écho au titre de la page/du post en cours.
J'espère que cette aide !!!!
Je pense que le thème de démarrage de Roots a une fonction fantastique pour obtenir le titre de la page actuelle, très hackable, couvre toutes les bases et peut être facilement utilisé avec le hook wp_title
https://github.com/roots/roots/blob/6.5.0/lib/titles.php .
/**
* Page titles
*/
function roots_title() {
if (is_home()) {
if (get_option('page_for_posts', true)) {
echo get_the_title(get_option('page_for_posts', true));
} else {
_e('Latest Posts', 'roots');
}
} elseif (is_archive()) {
$term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy'));
if ($term) {
echo $term->name;
} elseif (is_post_type_archive()) {
echo get_queried_object()->labels->name;
} elseif (is_day()) {
printf(__('Daily Archives: %s', 'roots'), get_the_date());
} elseif (is_month()) {
printf(__('Monthly Archives: %s', 'roots'), get_the_date('F Y'));
} elseif (is_year()) {
printf(__('Yearly Archives: %s', 'roots'), get_the_date('Y'));
} elseif (is_author()) {
$author = get_queried_object();
printf(__('Author Archives: %s', 'roots'), $author->display_name);
} else {
single_cat_title();
}
} elseif (is_search()) {
printf(__('Search Results for %s', 'roots'), get_search_query());
} elseif (is_404()) {
_e('Not Found', 'roots');
} else {
the_title();
}
}
$ title = get_the_title ($ post); $ parent_title = get_the_title ($ post-> post_parent); echo $ title; echo $ parent_title;
J'espère que ça va aider !! ;)
Je sais que c'est vieux, mais je suis tombé dessus et ce qui semble être le plus facile, c'est de l'utiliser.
<?php single_post_title(); ?>
Dans la boucle
<pre>
if ( have_posts() ) : while ( have_posts() ) : the_post();
/******************************************/
echo get_the_title();
/******************************************/
endwhile; endif;
</pre>
Cela vous montrera le titre de la page en cours . Pour référence http://codex.wordpress.org/Function_Reference/get_the_title
Afficher le titre avant le début de la boucle:
$page_title = $wp_query->post->post_title;
Je vous remercie
Une option, si vous recherchez la page demandée réelle, plutôt que l'ID de la page ou le slug, consiste à intercepter la requête:
add_action('parse_request', 'show_query', 10, 1);
Dans votre fonction, vous avez accès à l'objet $ wp et vous pouvez obtenir le nom de la page ou le nom de la publication avec:
function show_query($wp){
if ( ! is_admin() ){ // heck we don't need the admin pages
echo $wp->query_vars['pagename'];
echo $wp->query_vars['name'];
}
}
Si, par contre, vous avez vraiment besoin des données de publication, le premier endroit pour les obtenir (et sans doute dans ce contexte, le meilleur) est:
add_action('wp', 'show_page_name', 10, 1);
function show_page_name($wp){
if ( ! is_admin() ){
global $post;
echo $post->ID, " : ", $post->post_name;
}
}
Enfin, je réalise que ce n’était probablement pas la question du PO, mais si vous recherchez le nom de la page Admin , utilisez le $pagenow
global.
Voici ma version:
$title =ucwords(str_replace('-', ' ', get_query_var('pagename')));
get_query_var ('pagename') vient de me donner le slug de page. Donc, ce qui précède remplace tous les tirets et met la première lettre de chaque mot en majuscule - afin qu’il puisse être utilisé comme titre.
Cela fonctionne aussi si vous êtes dans le fichier functions.php. Ce n'est pas la meilleure approche car vous devez utiliser le tableau global, mais cela fonctionne.
1- Il faut d’abord ajouter un filtre. Il doit exister un meilleur filtre à utiliser que template_include mais je ne les connais pas tous. S'il vous plaît dirigez-moi vers le bon.
add_filter( 'template_include', 'var_template_include', 1000 );
function var_template_include( $template ){
global $wp_query;
$GLOBALS['current_page'] = $wp_query->get_queried_object()->post_name;
return $template;
}
2- Évitez d’utiliser la variable directement
function get_current_page( $echo = false ) {
if( !isset( $GLOBALS['current_page'] ) )
return false;
return $GLOBALS['current_page'];
}
3- Vous pouvez maintenant utiliser la fonction get_current_page()
dans n’importe quelle autre partie du fichier functions.php.
J'ai trouvé maintenant dans Wordpress Codec
cette fonction:
get interrogéhttp://codex.wordpress.org/Function_Reference/wp_list_pages
qui est un wrapper pour $wp_query->get_queried_object
. Cet article m'a mis dans la bonne direction, mais il semble que cette mise à jour soit nécessaire.
C'est ce que j'ai fini par utiliser, à compter de 2018:
<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">