Wie wird die URL der aktuellen Seite angezeigt?

55

Ich möchte benutzerdefinierten PHP-Code hinzufügen, um sicherzustellen, dass die URL dieser Seite immer dann auf dem Bildschirm angezeigt wird, wenn eine Seite meiner Website in meinem Browser geladen wird. Ich kann verwenden echo get_permalink(), aber das funktioniert nicht auf allen Seiten. Auf einigen Seiten (z. B. meiner Homepage ) werden mehrere Beiträge get_permalink()angezeigt. Wenn ich auf diesen Seiten verwende, wird die URL der angezeigten Seite nicht zurückgegeben (ich glaube, sie gibt die URL des letzten Beitrags in der Schleife zurück). Wie kann ich für diese Seiten die URL zurückgeben?

Kann ich get_permalink()einen bestimmten Haken anhängen , der ausgelöst wird, bevor die Schleife ausgeführt wird? Oder kann ich irgendwie aus der Schleife ausbrechen oder sie zurücksetzen, wenn sie abgeschlossen ist?

Vielen Dank.

cag8f
quelle
Können Sie einen Kontext angeben, was Sie mit dieser URL tun möchten? Versuchen Sie, gemeinsam nutzbare URLs zu erstellen? Eigene URLs für Links / Aktionen erstellen?
Tom J Nowell
@TomJNowell Ich möchte ein bestimmtes JS-Skript in die Warteschlange stellen, aber nur auf bestimmten Seiten (in diesem Fall sind diese Seiten die Startseite meiner Website in verschiedenen Sprachen: example.com , example.com/fr , example.com/es , usw). Die JS-Datei fügt Hyperlinks zu mehreren Titeln hinzu, die nur auf der Homepage erscheinen.
cag8f
Warum nicht einfach is_home()oder is_page( 'fr' )etc verwenden und das Skript nur dann in die Warteschlange stellen, wenn es wahr ist?
Tom J Nowell
@TomJNowell Nun, mein Code lautet: if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Dies scheint auf jeder Homepage zu funktionieren , unabhängig von der Sprache. Schlugen Sie das vor?
cag8f
Warum nicht nutzen $_SERVER['REQUEST_URI']und begleiten? Siehe diese Frage: stackoverflow.com/q/6768793/247696
Flimm

Antworten:

86

get_permalink() ist nur für einzelne Seiten und Posts wirklich nützlich und funktioniert nur innerhalb der Schleife.

Der einfachste Weg, den ich gesehen habe, ist der folgende:

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

$wp->requestEnthält den Pfadteil der URL, z. /path/to/pageund home_url()gibt die URL unter "Einstellungen"> "Allgemein" aus. Sie können jedoch einen Pfad anhängen, sodass der Anforderungspfad an die Ausgangs-URL in diesem Code angehängt wird.

Beachten Sie, dass dies wahrscheinlich nicht mit Permalinks funktioniert, die auf Normal gesetzt sind, und Abfragezeichenfolgen (der ?foo=barTeil der URL) weglässt.

Um die URL zu erhalten, wenn Permalinks auf "plain" gesetzt sind, können Sie sie $wp->query_varsstattdessen verwenden, indem Sie sie übergeben an add_query_arg():

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

Sie können diese beiden Methoden auch kombinieren, um die aktuelle URL einschließlich der Abfragezeichenfolge abzurufen, unabhängig von den Permalink-Einstellungen:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );
Jacob Peattie
quelle
7
Wenn Permalinks auf Ebene: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.
Max Yudin
1
@Jacob Ich habe das versucht, aber es scheint nur die URL meiner Homepage zurückzugeben. Wie Sie oben links auf dieser Seite sehen können ( dev.horizonhomes-samui.com/properties/hs0540 ), wo ich Code eingefügt habe echo home_url( $wp->request ). Ich habe auch dafür gesorgt global $wp. Permalinks sind nicht "Normal", sondern auf "Post Name" gesetzt. Ich sehe auch keine relevanten PHP-Fehler im Log. Diese spezielle Seite ist Teil meiner Entwickler-Site, die ansonsten für Besucher gesperrt ist. Ich bin mir nicht sicher, ob das wichtig ist oder nicht. edit: Eigentlich halte diesen Gedanken - könnte ein Benutzerfehler sein. Stehen Sie
bereit
@Jacob edit 2: OK dein Code funktioniert tatsächlich. Mein Problem war, dass ich den Code in die Datei functions.php 'naked' aufgenommen habe, dh nicht in eine Funktion, die an einen Hook angehängt ist. Ihr Code gab also die URL der Startseite zurück, unabhängig von der Seite, die in meinem Browser angezeigt wurde. Nachdem ich den Code in eine Funktion verschoben habe - eine Funktion, die an einen WP-Hook angehängt ist (wp_enqueue_scripts), wurde tatsächlich die URL der angezeigten Seite zurückgegeben. Kennen Sie den Grund für dieses Verhalten? Vielleicht muss ich dafür eine neue Frage erstellen.
cag8f
3
@ cag8f Wenn der Code in functions.php "nackt" steht, führen Sie ihn aus, bevor alle Eigenschaften des $ wp-Objekts eingerichtet wurden. Wenn Sie es in eine Funktion einbinden, die an einen geeigneten Hook angehängt ist, verzögern Sie die Ausführung, bis ein geeigneter Punkt im Wordpress-Code ausgeführt wird.
Andy Macaulay-Brook
Diese Methoden sind alle fantastisch und großartige Ideen für die Arbeit mit WordPress. Sie können trailingslashit()sie jedoch je nach Bedarf erweitern.
Jake
8

Sie können den folgenden Code verwenden, um die gesamte aktuelle URL in WordPress abzurufen:

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

Dadurch wird der vollständige Pfad einschließlich der Abfrageparameter angezeigt.

rescue1155
quelle
Hallo - wenn Sie sich developer.wordpress.org/reference/functions/add_query_arg ansehen , werden Sie feststellen, dass Ihr Code die vorhandenen Abfrageparameter nicht tatsächlich beibehält.
Andy Macaulay-Brook
2
Um Abfrageparameter zu erhalten müssen Sie die leere ersetzen array()mit $_GET. Dh:home_url(add_query_arg($_GET,$wp->request));
Brad Adams
Es funktioniert nicht, wenn WordPress im Unterverzeichnis
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
quelle
Können Sie erklären, wie und warum dieser Code die Frage löst?
kero
Meiner Meinung nach die flexibelste Lösung. Es funktioniert auf jeder WP-Seite (sogar auf wp-admin, wp-login.php, Archivseiten usw.). Beachte nur, dass es keine URL-Parameter enthält
Philipp
1

Der folgende Code gibt die aktuelle URL an:

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

Sie können den folgenden Code verwenden, um die vollständige URL zusammen mit den Abfrageparametern abzurufen.

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

Dadurch wird der vollständige Pfad einschließlich der Abfrageparameter angezeigt. Dadurch werden die Abfrageparameter beibehalten, sofern sie bereits in der URL enthalten sind.

Adiyya Tadikamalla
quelle
Dieses Snippet überspringt wp-admin/plugins.phpmeine aktuelle URL, es sind nur der Stammpfad und die Abfragezeichenfolgen.
Ryszard Jędraszyk
0

Dies ist ein verbessertes Beispiel, das bereits erwähnt wurde. Es funktioniert, wenn hübsche URLs aktiviert sind. Es wird jedoch verworfen, wenn Abfrageparameter wie / page-slug /? Param = 1 vorhanden sind oder die URL überhaupt hässlich ist.

Das folgende Beispiel funktioniert in beiden Fällen.

    $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
quelle
0

Vielleicht wp_guess_url()ist was du brauchst. Verfügbar seit Version 2.6.0.

Fließen
quelle
Dies errät nur die Basis-URL. Auf dem Frontend hat man einen ähnlichen Effekt wie home_url().
Jake,
0

Warum nicht einfach benutzen?

get_permalink(get_the_ID());
Dario Zadro
quelle