Comment obtenir l'URL de la page actuelle affichée?

56

Je souhaite ajouter du code PHP personnalisé pour m'assurer que chaque fois qu'une page de mon site se charge dans mon navigateur, l'URL de cette page est répercutée à l'écran. Je peux utiliser echo get_permalink(), mais cela ne fonctionne pas sur toutes les pages. Certaines pages (par exemple, ma page d’accueil ) affichent plusieurs publications et si j’utilise get_permalink()ces pages, l’URL de la page affichée ne sera pas renvoyée (je crois qu’elle renvoie l’URL du dernier message de la boucle). Pour ces pages, comment puis-je renvoyer l'URL?

Puis-je attacher get_permalink()un crochet particulier qui se déclenche avant l'exécution de la boucle? Ou puis-je en quelque sorte sortir de la boucle, ou le réinitialiser une fois terminé?

Merci.

cag8f
la source
Pouvez-vous fournir un contexte quant à ce que vous voudriez faire avec cette URL? Essayez-vous de créer des URL partageables? Assembler des URL personnalisées pour des liens / actions?
Tom J Nowell
@TomJNowell Je voudrais mettre en file d'attente un script JS particulier, mais uniquement sur certaines pages (dans ce cas, ces pages sont la page d'accueil de mon site dans différentes langues: exemple.com , exemple.com/fr , exemple.com/es , etc). Le fichier JS servira au serveur pour ajouter des hyperliens à plusieurs titres qui apparaissent uniquement sur la page d'accueil.
cag8f
pourquoi ne pas simplement utiliser is_home()ou is_page( 'fr' )etc et ne mettre en file d'attente le script que si c'est vrai?
Tom J Nowell
@TomJNowell Eh bien maintenant, mon code est if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Cela semble se déclencher sur toutes les pages d'accueil, quelle que soit la langue. Est-ce ce que vous suggérez?
cag8f
Pourquoi ne pas utiliser $_SERVER['REQUEST_URI']et compagnie? Voir cette question: stackoverflow.com/q/6768793/247696
Flimm

Réponses:

88

get_permalink() n'est vraiment utile que pour les pages simples et les publications, et ne fonctionne que dans la boucle.

La manière la plus simple que j'ai vue est la suivante:

global $wp;
echo home_url( $wp->request )

$wp->requestinclut la partie chemin de l'URL, par exemple. /path/to/pageet home_url()renvoie l'URL dans Paramètres> Général, mais vous pouvez y ajouter un chemin. Nous ajoutons donc le chemin de requête à l'URL d'accueil dans ce code.

Notez que cela ne fonctionnera probablement pas avec Permalinks défini sur Plain et laissera des chaînes de requête (la ?foo=barpartie de l'URL).

Pour obtenir l'URL lorsque les permaliens sont définis sur plain, vous pouvez utiliser ceux-ci $wp->query_vars, en les transmettant à add_query_arg():

global $wp;
echo add_query_arg( $wp->query_vars, home_url() );

Et vous pouvez combiner ces deux méthodes pour obtenir l'URL actuelle, y compris la chaîne de requête, quels que soient les paramètres de permalien:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );
Jacob Peattie
la source
7
Si permaliens réglé sur simple: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.
Max Yudin
1
@Jobob J'ai essayé cela, mais il semble ne renvoyer que l'URL de ma page d'accueil. Comme vous pouvez le voir en haut à gauche de cette page ( dev.horizonhomes-samui.com/properties/hs0540 ), où j'ai inséré du code echo home_url( $wp->request ). Je me suis assuré d'inclure global $wpégalement. Les permaliens ne sont pas «simples», mais définis sur «Nom du message». Je ne vois aucune erreur PHP pertinente dans le journal non plus. Cette page particulière fait partie de mon site de développement, qui est autrement bloqué pour les visiteurs. Je ne sais pas si cela compte ou non. edit: En fait, maintenez cette pensée - pourrait être une erreur de l'utilisateur. En
attente
@Jobob edit 2: OK votre code fonctionne vraiment. Mon problème était que j'incluais le code dans functions.php 'naked', c'est-à-dire pas dans une fonction attachée à un hook. Votre code renvoyait donc l'URL de la page d'accueil, quelle que soit la page affichée dans mon navigateur. Une fois que j'ai déplacé le code dans une fonction - une fonction attachée à un hook WP (wp_enqueue_scripts), il a bien renvoyé l'URL de la page affichée. Connaissez-vous la raison de ce comportement? J'ai peut-être besoin de créer une nouvelle question pour cela.
cag8f
3
@ cag8f Si le code est "nu" dans functions.php, vous l'exécutez avant que toutes les propriétés de l'objet $ wp aient été définies. Lorsque vous l'enroulez dans une fonction attachée à un hook approprié, vous en retardez l'exécution jusqu'à l'exécution du code approprié dans le code Wordpress.
Andy Macaulay-Brook
Ces méthodes sont toutes géniales et constituent d'excellentes idées pour travailler avec WordPress. Vous pouvez cependant y ajouter trailingslashit(), en fonction de vos besoins.
Jake
8

Vous pouvez utiliser le code ci-dessous pour obtenir l'URL complète actuelle dans WordPress:

global $wp;
$current_url = home_url(add_query_arg(array(), $wp->request));

Cela montrera le chemin complet, y compris les paramètres de requête.

sauvetage1155
la source
Bonjour. Si vous consultez la page developer.wordpress.org/reference/functions/add_query_arg, vous constaterez que votre code ne conserve pas les paramètres de requête existants.
Andy Macaulay-Brook
2
Pour conserver les paramètres de requête, vous devez remplacer le vide array()par $_GET. À savoir:home_url(add_query_arg($_GET,$wp->request));
Brad Adams
Cela ne fonctionnera pas si WordPress est installé dans le sous
ManzoorWani
1
function current_location()
{
    if (isset($_SERVER['HTTPS']) &&
        ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
        $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
        $protocol = 'https://';
    } else {
        $protocol = 'http://';
    }
    return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

echo current_location();
Shree Sthapit
la source
Pouvez-vous expliquer comment et pourquoi ce code résout la question?
kero
A mon avis la solution la plus flexible. Cela fonctionne sur n'importe quelle page WP (même sur wp-admin, wp-login.php, les pages d'archives, etc.). Remarquez simplement qu'il n'inclut aucun paramètre d'URL
Philipp
1

Le code suivant donnera l'URL actuelle:

global $wp;
echo home_url($wp->request)

Vous pouvez utiliser le code ci-dessous pour obtenir l'URL complète avec les paramètres de requête.

global $wp;  
$current_url = home_url(add_query_arg(array($_GET), $wp->request));

Cela montrera le chemin complet, y compris les paramètres de requête. Cela préservera les paramètres de requête si déjà dans l'URL.

Adiyya Tadikamalla
la source
Cet extrait saute wp-admin/plugins.phpdans mon URL actuelle, il ne s'agit que du chemin racine et des chaînes de requête.
Ryszard Jędraszyk
0

C'est un moyen d'exemple amélioré que mentionné précédemment. Cela fonctionne lorsque les jolies URL sont activées, mais il est ignoré s'il existe un paramètre de requête tel que / page-slug /? Param = 1 ou si l'URL est moche.

L'exemple suivant fonctionnera dans les deux cas.

    $query_args = array();

    $query = wp_parse_url( $YOUR_URL );

    $permalink = get_option( 'permalink_structure' );

    if ( empty( $permalink ) ) {

        $query_args = $query['query'];

    }

    echo home_url( add_query_arg( $query_args , $wp->request ) )
Tolginho
la source
0

C'est peut wp_guess_url()- être ce dont vous avez besoin. Disponible depuis la version 2.6.0.

Couler
la source
Cela devine juste l'URL de base. Sur le frontend, vous obtenez un effet similaire à home_url().
Jake
0

Pourquoi ne pas simplement utiliser?

get_permalink(get_the_ID());
Dario Zadro
la source