WordPress Holen Sie sich die Seiten-ID außerhalb der Schleife


Antworten:


157

Wenn Sie hübsche Permalinks verwenden, get_query_var('page_id')funktioniert dies nicht.

Rufen Sie stattdessen die abgefragte Objekt-ID von der globalen$wp_query Adresse ab :

// Since 3.1 - recommended!
$page_object = get_queried_object();
$page_id     = get_queried_object_id();


// "Dirty" pre 3.1
global $wp_query;

$page_object = $wp_query->get_queried_object();
$page_id     = $wp_query->get_queried_object_id();

Perfekt für hübsche Permalinks. Ich habe global $ post verwendet. echo $ post-> ID; Aber das hat nicht funktioniert. Vielen Dank!
Sumith Harshan

7
get_queried_object_id();gib 0 für mich zurück. Ich denke, dass das Problem ist, dass ich es nach einer benutzerdefinierten Abfrage aufrufe. Ich möchte die aktuelle Seiten-ID.
Victor

Seltsam, get_queried_object();hat bei mir nicht funktioniert, $wp_query->get_queried_object();tut es aber ... Ich habe mir das angeschaut get_queried_object();und es ist dasselbe wie bei letzterem.
SeanJA

Könnte Ihr variabler Bereich sein - haben Sie ihn $wp_querymit einer benutzerdefinierten Abfrage überschrieben ?
TheDeadMedic

9

Sie können auch eine generische Funktion erstellen, um die ID des Posts abzurufen, unabhängig davon, ob er sich außerhalb oder innerhalb der Schleife befindet (behandelt beide Fälle):

<?php

/**
 * @uses WP_Query
 * @uses get_queried_object()
 * @see get_the_ID()
 * @return int
 */
function get_the_post_id() {
  if (in_the_loop()) {
       $post_id = get_the_ID();
  } else {
       global $wp_query;
       $post_id = $wp_query->get_queried_object_id();
         }
  return $post_id;
} ?>

Und einfach machen:

$page_id = get_the_post_id();

7

Verwenden Sie stattdessen diesen globalen $ post:

global $post;
echo $post->ID;

Dies funktioniert nur nach der Schleife, nicht vorher, da dies $postbeim Starten von "the loop" initialisiert wird.
Christian Davén

6
@ ChristianDavén - das ist nicht wahr. Dieser Code funktioniert am Anfang der page.php
iWizard

4

Wenn Sie dieses Thema aufgrund der Postseite (Indexseitenalternative bei Verwendung der statischen Startseite) auf irgendeine Weise durchsucht haben, lautet die richtige Antwort:

if (get_option('show_on_front') == 'page') {
    $page_id = get_option('page_for_posts');
    echo get_the_title($page_id);
}

(entnommen aus Forrst | Echo WordPress "Posts Page" -Titel - Code von tammyhart )


1

Wenn Sie auf einer Seite sind und dies nicht funktioniert:

$page_object = get_queried_object();
$page_id     = get_queried_object_id();

Sie können versuchen, den Permalink manuell mit PHP zu erstellen, um die Post-ID nachzuschlagen:

// get or make permalink
$url = !empty(get_the_permalink()) ? get_the_permalink() : (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$permalink = strtok($url, '?');

// get post_id using url/permalink
$post_id = url_to_postid($url);

// want the post or postmeta? use get_post() or get_post_meta()
$post = get_post($post_id);
$postmeta = get_post_meta($post_id);

Möglicherweise wird nicht jeder mögliche Permalink abgefangen (insbesondere, da ich die Abfragezeichenfolge entfernt habe), aber Sie können ihn an Ihren Anwendungsfall anpassen.


0

Sie können is_page($page_id)außerhalb der Schleife verwenden, um zu überprüfen.


Ich möchte keine Seite überprüfen, ich möchte die ID der aktuellen Seite erhalten.
Atif Mohammed Ameenuddin

@atif Sind Sie sicher, dass tatsächlich eine Seiten-ID übergeben wird? Sie sind nicht zufällig auf der Titelseite?
Pekka

0

Diese Funktion erhält ID von einem Seitenstrom.

get_the_ID();

4
ähm ... das funktioniert nur, wenn Sie in der Schleife sind : Gibt die numerische ID des aktuellen Beitrags zurück. Dieses Tag muss sich in The Loop befinden.
Drzaus

@drzaus Eigentlich funktioniert das außerhalb der Schleife ... Schau es dir an.
Hitautodestruct

1
@hitautodestruct Obwohl Sie technisch korrekt sind, dass es außerhalb der Schleife funktionieren könnte , ist es keine zuverlässige Verwendung - dies ist aus persönlicher Erfahrung sowie aus dem Blick auf den Quellcode. Die zugrunde liegende Methode get_post wird zufällig verwendet $GLOBALS['post'], die möglicherweise irgendwann ausgefüllt wurde , aber es gibt keine Garantie, es sei denn / bis Sie in der Schleife sind.
Drzaus


0

Verwenden Sie die folgenden zwei Codezeilen, um die aktuelle Seiten- oder Beitrags-ID abzurufen

global $post;
echo $post->ID;

0

Ich habe es folgendermaßen gemacht und es hat perfekt für mich funktioniert.

Deklarierte zuerst eine globale Variable in der header.php und wies die ID des Beitrags oder der Seite zu, bevor sie sich ändert, da die LOOP ihr die ID des zuletzt angezeigten Eintrags zuweist:

$GLOBALS['pageid] = $wp_query->get_queried_object_id();

Und um irgendwo in der Vorlage zu verwenden, Beispiel in der footer.php:

echo $GLOBALS['pageid];


-3

Dies ist der richtige Code.

echo $post->ID;

-3

Wenn Sie nicht in der WordPress-Schleife sind, können Sie keine der WordPress-Methoden verwenden, daher müssen Sie reines PHP verwenden.

Sie können diesen Code verwenden. Und sicher wird dir helfen :)

$page_id = @$_GET['page_id'];

if (!is_numeric($page_id)) {
    // Then the uri must be in friendly format aka /my_domain/category/onepage/
    // Try this
    //$path = '/www/public_html/index.php/';
    ///$path = '/my_domain/category/onepage/';
    $path = $_SERVER['REQUEST_URI'];
    // Clean the uri
    //$path = str_replace('/', '', $page);
    $path = str_replace('.php', '', $path);
    //$path = str_replace('?s=', '', $path);
    $path = $path ? $path : 'default';

    $path_len = strlen($path);
    $last_char = substr($path, $path_len -1);
    //echo $last_char;
    $has_slash = strpos($last_char, "/");
    //echo $has_slash;
    if ($has_slash === 0) :
        $path = substr($path, 0, $path_len -1);
    elseif ($has_slash === null) :
        $path = substr($path, 0, $path_len);
    endif;
    //echo "path: ".$path; // '/www/public_html/index'
    $page = substr(strrchr($path, "/"), 1);
    echo "page: ".$page; // 'index'
}

$my_page_id = 31;
$my_page = 'mypage';

//echo "page: ".$page;
//echo "page_id ".$page_id;
if($page_id == $my_page_id || $page == $my_page) 
{
    // your stuff....
}

Genießen!


Vielleicht .. Könnten Sie bitte mehr Details dazu geben und mir Ihre Lösung zeigen?
Edcv

1
Sie haben 50 Codezeilen geschrieben, um die bereits vorhandene Variable abzurufen $post->ID. Auch wenn Sie nicht auf dem Laufenden sind, können Sie viele, viele Wordpress-Funktionen verwenden. Nur nicht die wenigen, die in der Schleife verwendet werden müssen.
JakeParis

Nun, wenn Sie den kommentierten Code entfernen, habe ich 20 Zeilen geschrieben. Diese Zeilen haben mir den Tag gerettet, an dem ich WordPress gelernt habe. Sie haben 3 Zeilen geschrieben, aber Sie haben keine Lösung für die OP-Frage, wenn Sie sich außerhalb der Schleife befinden.
Edcv
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.