Comment puis-je obtenir le nom de la page actuelle dans WordPress?

163

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 vu jusqu'à présent ( the_title(), get_page()->post_name, get_post(), etc.) ne fonctionnent pas pour une page qui contient des entrées de poste. Ils renverront tous le nom de la dernière entrée de blog.

En d'autres termes, supposons que vous ayez une page créée dans WordPress avec le nom «Mes nouvelles». Cette page est définie comme la "page de publication". Ajoutez quelques articles à la page. Maintenant, quelle API peut être utilisée pour récupérer la chaîne "my-news" au lieu du nom du dernier message?


J'ai trouvé la variable suivante qui semble fonctionner.

$wp_query->queried_object->post_name

C'est en fait la version conviviale du nom de la page (slug), ce que je recherchais également. Cela a été testé avec le modèle par défaut ( Twenty Ten ). Je ne sais vraiment pas pourquoi les deux variables ci-dessous ne fonctionnent pas sur mon site. Merci à keatch pour le print_r()tuyau .

Maintenant, pourquoi cette information est-elle si profondément cachée?

Bernard
la source
pour le nom, utilisez: single_post_title ('', false); pour le slug, utilisez: get_query_var ('pagename');
jtmielczarek

Réponses:

183

La variable globale WordPress $pagenamedevrait être disponible pour vous. Je viens d'essayer avec la même configuration que vous avez spécifiée.

$pagenameest 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 vos fichiers de thème de page ne soient analysés, donc il est disponible à tout moment dans vos modèles de pages.

  • Bien que cela ne semble pas être documenté, la $pagenamevariable n'est définie que si vous utilisez des permaliens. Je suppose que c'est parce que si vous ne les utilisez pas, WordPress n'a pas besoin du slug de page, donc il ne le configure pas.

  • $pagename n'est pas défini si vous utilisez la page comme une page d'accueil statique.

    • C'est le code dans /wp-includes/theme.php, qui utilise la solution que vous avez indiquée quand $pagenamene peut pas être définie:

      $ nom de page = get_query_var ('nom de page'); if (! $ nom de page && $ id> 0) {// Si une page statique est définie comme page d'accueil, $ nom de page ne sera pas défini. Récupérez-le depuis l'objet interrogé $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }

AJJ
la source
4
$ pagename est vide lorsqu'il est utilisé dans header.php. J'ai essayé d'utiliser le modèle par défaut (vingt dix) et de l'utiliser immédiatement après la balise <body> mais il n'est pas défini. Incidemment, aucune des variables query_vars ne semble être définie à ce stade.
Bernard
1
Je ne vois aucune raison de l'absence de cette variable, peut-être ai-je mal compris votre configuration? J'ai compris que vous essayez de faire cela dans un modèle de page. Même si vous écrivez "echo $ pagename" dans la première ligne de header.php, cela devrait vous donner la valeur. Quelle version de WP traitez-vous?
AJJ
1
Vous pouvez essayer une approche légèrement différente en utilisant get_query_var ('pagename').
AJJ
@AJweb: Oui, c'est pour un modèle que je construis mais j'utilise le modèle par défaut pour les tests, dans header.php. J'ai l'impression que vous n'avez pas testé votre solution. Voyez-vous le nom de la page lorsque vous mettez un <h1> <? Php echo $ pagename?> </h1> juste après la balise <body> dans header.php?
Bernard
1
Cela a fait l'affaire pour moi: $pagename = $wp_query->queried_object->post_name;, juste ne pas oublier de mettre global $wp_query;avant!
Saran du
39

Mon approche pour obtenir le nom du slug de la page:

$slug = basename(get_permalink());
Goksel
la source
Cela ne fonctionne que s'ils utilisent une jolie URL, n'est-ce pas?
Betty
24

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' $wp_queryobjet.

keatch
la source
1
Cela ne fonctionne pas non plus. Si j'imprime l'objet $ wp_query juste après la balise <body>, je vois que le premier objet de publication est l'entrée de blog, pas la page elle-même. Cependant, merci pour le conseil print_r (). Je pourrais trouver la variable qui contient les informations que je recherche (en mettant ces informations dans la question).
Bernard
en écho que $ page_title var a fonctionné pour moi dans l'en-tête, merci.
Claire
22
<?php wp_title(''); ?>

Cela a fonctionné pour moi.

Si je comprends bien, vous souhaitez obtenir le nom de la page sur une page contenant des entrées de publication.

GregB
la source
10

Vous pouvez obtenir la page actuelle, la publication ou le type de publication personnalisé 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 par wp_reset_postdata();pour $postrevenir à l'élément par défaut affiché (la page).

Notez que la variable 'post_title' est également disponible pour toute boucle / requête personnalisée ... y compris les éléments de menu et les pièces jointes multimédias ... tout dans WordPress est un `` post ''.

James
la source
Cette réponse date de 2012, y a-t-il des connaissances pour savoir si cette méthode fonctionnera toujours avec des WP plus récents?
Martin le
1
Oui, c'est le cas - la gestion de base des types de messages par WP n'a pas changé
James
8

Si vous cherchez à accéder à la page actuelle à partir de votre fichier functions.php (donc, avant que la boucle, avant ne $postsoit remplie, avant d' $wp_queryêtre initialisée, etc ...) vous n'avez vraiment pas d'autre choix que d'accéder aux variables du serveur elles-mêmes et extraire la page demandée de la chaîne de requête.

$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )

Notez que c'est une solution «stupide». Il ne sait pas, par exemple, que la page avec le slug 'coming-soon' l'est également p=6. Et cela suppose que vos paramètres de permalien sont définis sur pagename(ce qu'ils devraient être de toute façon!).

Pourtant, cela peut être une petite astuce 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", donc je dois exclure la page "à venir" de cette règle:

global $pagenow;
if (
        ! is_admin() &&
        'wp-login.php' != $pagenow &&
        'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
        ! is_user_logged_in()
){
   wp_safe_redirect( 'coming-soon' );
}
Tom Auger
la source
7

Je pense que le thème de démarrage Roots a une fonction fantastique pour obtenir le titre de la page actuelle. Il est très piratable, couvre toutes les bases et peut être facilement utilisé avec le wp_titlecrochet.

/**
 * 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();
  }
}
Sy Holloway
la source
5

Essaye ça:

$pagename = get_query_var('pagename');
Mohammad Sabbagh
la source
Une explication s'impose (répondez en éditant votre réponse , pas ici dans les commentaires).
Peter Mortensen le
5

J'ai trouvé une solution plus simple.

Récupère la valeur renvoyée du nom de la page par wp_title (). S'il est vide, affiche le nom de la page d'accueil, sinon renvoie la valeur wp_title ().

<?php $title = wp_title('', false); ?>

N'oubliez pas de supprimer la séparation avec le premier argument, puis de définir display sur false pour l'utiliser comme entrée de la variable. Ensuite, ajoutez simplement le code entre vos balises d'en-tête, etc.

<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>

Cela a fonctionné un régal pour moi et en veillant à ce que le premier soit déclaré dans la section où vous souhaitez extraire le $title, cela peut être réglé pour renvoyer différentes variables.

Tech1337
la source
5

Il suffit d'utiliser la variable globale "post":

global $post;
echo $post->post_title;

Cela fera écho au titre actuel de la page / de l'article.

Rahul Balakrishna
la source
Qu'en est-il de HTML GET ?
Peter Mortensen le
4

Utilisation:

$title = get_the_title($post);
$parent_title = get_the_title($post->post_parent);

echo $title;
echo $parent_title;
Jerad Rutnam
la source
Une explication s'impose.
Peter Mortensen le
3

Cela semble être le plus simple à utiliser:

<?php single_post_title(); ?>
Bowenac
la source
1
Cet appel renvoie le nom du dernier message, pas le nom de la page qui contient les articles, du moins c'est ce que je comprends de la documentation en ligne sans le tester.
Bernard
Ceci est exactement ce que je cherchais. J'ai créé un nouvel en-tête pour ma page et cela a tiré le nom de la page comme prévu. Merci!
AJ Hernandez
3

Afficher le titre avant le début de la boucle:

$page_title = $wp_query->post->post_title;
Ajay Malhotra
la source
2

Une option, si vous recherchez la page interrogée, plutôt que l'ID de 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 page ou le nom de l'article 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 global $pagenow.

Tom Auger
la source
2

Dans la boucle WordPress :

if ( have_posts() ) : while ( have_posts() ) : the_post();
/******************************************/
echo get_the_title();
/******************************************/
endwhile; endif;

Cela vous montrera le titre de la page actuelle.

Pour référence: get_the_title ()

Umair Hamid
la source
1

Voici ma version:

$title = ucwords(str_replace('-', ' ', get_query_var('pagename')));

get_query_var ('pagename') me donnait juste le slug de page. Ainsi, ce qui précède remplace tous les tirets et rend la première lettre de chaque mot en majuscule - afin qu'il puisse effectivement être utilisé comme titre.

gris
la source
0

C'est ce que j'ai fini par utiliser, à partir de 2018:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
Subvention
la source
0

J'ai maintenant trouvé cette fonction sur WordPress Codec ,

être interrogé

qui est un wrapper pour $wp_query->get_queried_object.

Ce post m'a mis dans la bonne direction, mais il semble qu'il ait besoin de cette mise à jour.

Sandra
la source
0

Cela fonctionne également si vous êtes dans le functions.php. Ce n'est pas la meilleure approche car vous devez utiliser le tableau global, mais cela fonctionne.

  1. Tout d'abord, nous devons ajouter un filtre. Il doit exister un meilleur filtre à utiliser que le template_include, mais je ne les connais pas tous. Veuillez m'indiquer la bonne.

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

toto_tico
la source