web-dev-qa-db-de.com

Wie rufe ich den Block der aktuellen Seite ab?

Ich versuche, den Slug der aktuellen WordPress-Seite außerhalb der Schleife abzurufen. Der Titel der Seite gibt wp_title () zurück, aber wie kann ich den Slug bekommen?

<li>
  <a href="/slug-of-current-page/">
    <?php wp_title('', true); ?>
  </a>
</li>
93
sarytash

Verwenden Sie die globale Variable $post :

<?php 
    global $post;
    $post_slug = $post->post_name;
?>
147
Arvind Pal

Wie in anderen Antworten angegeben, wird slug in der Eigenschaft post_name gespeichert. Während es könnte direkt zugegriffen werden, bevorzuge ich die (nicht genutzte) Funktion get_post_field() für den Zugriff auf Post-Eigenschaften, für die es keine richtige API gibt.

Es erfordert einen explizit bereitgestellten Beitrag und nicht standardmäßig den aktuellen. Für den aktuellen Beitrag wäre dies also:

$slug = get_post_field( 'post_name', get_post() );
64
Rarst

5. APRIL 2016 BEARBEITEN

Nachdem ich nach mehr Zuverlässigkeit gegraben hatte, habe ich diese Antwort auf den folgenden Beitrag verwiesen, der zu dieser Änderung führt: ( Schau es dir an )

Die zuverlässigste Methode, die ich bis heute finden konnte, ist die folgende:

// Get the queried object and sanitize it
$current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() );
// Get the page slug
$slug = $current_page->post_name;

Auf diese Weise sind Sie zu 99,9999% sicher, dass Sie jedes Mal die richtigen Daten erhalten.

URSPRÜNGLICHE ANTWORT

Eine andere sicherere Alternative zu diesem Problem ist die Verwendung von get_queried_object(), die das aktuell abgefragte Objekt enthält, um den Seiten-Slug abzurufen, der von der Eigenschaft post_name gehalten wird. Dies kann überall in Ihrer Vorlage verwendet werden.

$post kann verwendet werden, aber es kann unzuverlässig sein, da jede benutzerdefinierte Abfrage oder jeder benutzerdefinierte Code den Wert von $post ändern kann. Daher sollte dies außerhalb der Schleife vermieden werden.

Die Verwendung von get_queried_object() zum Abrufen des aktuellen Seitenobjekts ist viel zuverlässiger und wird mit geringerer Wahrscheinlichkeit geändert, es sei denn, Sie verwenden den bösen query_posts, der das Hauptabfrageobjekt zerstört, aber das liegt dann ganz bei Ihnen.

Sie können das oben genannte wie folgt verwenden

if ( is_page() )
    $slug = get_queried_object()->post_name;
25
Pieter Goosen

Der einfache Weg, um die Schnecke zu bekommen, ist mit:

<?php echo basename(get_permalink()); ?>
11
tracey

In Anbetracht des Codebeispiels sieht es so aus, als ob Sie wirklich einen Link benötigen. In diesem Fall können Sie get_permalink () verwenden, das außerhalb der Schleife verwendet werden kann. Das sollte das tun, was Sie zuverlässiger benötigen als die Verwendung der Pfostenschnecke.

8
Matthew Boynes

Könnte eine alte Frage sein, aber ich habe die Funktionen get_the_slug () und the_slug () basierend auf Ihren Antworten erstellt.

if ( !function_exists("get_the_slug") ) {
    /**
    * Returns the page or post slug.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    * @return string
    */
    function get_the_slug( $id = null ){
        $post = get_post($id);
        if( !empty($post) ) return $post->post_name;
        return ''; // No global $post var or matching ID available.
    }
    /**
    * Display the page or post slug
    *
    * Uses get_the_slug() and applies 'the_slug' filter.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    */
    function the_slug( $id=null ){
        echo apply_filters( 'the_slug', get_the_slug($id) );
    }
}
2
Earlee

Nur weiter auf @Matthew Boynes Antwort, wenn Sie daran interessiert sind, die übergeordnete Schnecke (falls vorhanden) auch zu bekommen, dann habe ich diese Funktion nützlich gefunden:

function mytheme_get_slugs() {
    if ( $link = get_permalink() ) {
        $link = str_replace( home_url( '/' ), '', $link );
        if ( ( $len = strlen( $link ) ) > 0 && $link[$len - 1] == '/' ) {
            $link = substr( $link, 0, -1 );
        }
        return explode( '/', $link );
    }
    return false;
}

ZB um die Schnecke (n) der Körperklasse hinzuzufügen:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );
0
bonger

Ich verstehe ehrlich gesagt nicht, warum keine der Antworten einfach so ist:

global $wp;
$current_slug = $wp->request;

// Given the URL of https://example.com/foo-bar
if ($current_slug === 'foo-bar') {
  // the condition will match.
}

Dies funktioniert für alle Posts, Seiten und benutzerdefinierten Routen.

0
leymannx

Dies ist die Funktion, die verwendet werden soll, wenn der Slug außerhalb der Schleife abgerufen werden soll.

get_post_field( 'post_name');

Antwort hier gefunden: Wie man den Slug der aktuellen Seite in WordPress abruft?

0
Kash

Wenn Sie eine umfassendere Antwort wünschen, können Sie mit der folgenden SQL-Abfrage jederzeit alle Posts abrufen, die entweder Posts, Seiten oder benutzerdefinierte Taxonomien sind, auch wenn noch keine Hooks ausgelöst wurden.

Raw SQL:


SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS 
`slug`, `post_status` AS `status`
FROM wp_posts 
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;

Dies funktioniert sogar in der allerersten Zeile Ihrer Funktionsdatei, noch vor den Hooks mu_plugins_loaded oder init.

@Hinweis

Dies setzt voraus, dass Sie ein Standard-Datenbankpräfix wp_posts haben. Wenn Sie variable Präfixe berücksichtigen müssen, können Sie die richtige Post-Tabelle ganz einfach über PHP abrufen, indem Sie die folgenden Schritte ausführen:

<?php
global $wpdb;
$table = $wpdb->posts;
$query = "SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS 
`slug`, `post_status` AS `status`
FROM " . $table . "
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;"

Führen Sie dann entweder $wpdb, mysqli oder eine PDO-Instanz aus. Da diese Abfrage keine Benutzereingaben enthält, kann sie ohne eine vorbereitete Anweisung ausgeführt werden, solange Sie keine Variablen in sie einfügen.

Ich würde vorschlagen, dies als privaten statischen Wert einer Klasse zu speichern, damit auf sie zugegriffen werden kann, ohne die Abfrage mehr als einmal pro Seite erneut auslösen zu müssen, um die bestmögliche Leistung zu erzielen.

class Post_Cache
{
    private static $post_cache;

    public function __construct()
    {
        //This way it skips the operation if it's already set.
        $this->initCache();
    }

    public function get($id, $type = null)
    {
        if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) )
            return false;
        }
        if ( !is_null( $type ) )
        {
            //returns the specific column value for the id
            return self::$post_cache[$id][$type];
        }
        //returns the whole row
        return self::$post_cache[$id];
    }

    private function initCache()
    {
        if ( is_null(self::$post_cache) )
        {

            $query = "...";
            $result = some_query_method($query); //Do your query logic here.
            self::$post_cache = $result;
        {
    }
}

Verwendungszweck

$cache = new \Post_Cache();

//Get the page slug
$slug = $cache->get( get_the_ID(), 'slug');

if ($cache->get( get_the_ID() ))
{
    //post exists
} else {
    //nope, 404 'em
}
if ( $cache->get( get_the_ID(), 'status') === 'publish' )
{
    //it's public
} else {
    //either check current_user_can('whatever_permission') or just 404 it,
    //depending whether you want it visible to the current user or not.
}
if ( $cache->get( get_the_ID(), 'type') === 'post' )
{
    //It's a post
}
if ( $cache->get( get_the_ID(), 'type') === 'page' )
{
    //It's a page
}

Sie bekommen das Wesentliche. Wenn Sie weitere Details benötigen, können Sie diese wie gewohnt mit new \WP_Post( get_the_ID() ); abrufen.


Auf diese Weise können Sie die Posts jederzeit überprüfen, auch wenn die WordPress-Schleife nicht an einem Punkt angekommen ist, an dem Ihre Anfrage als akzeptabel erachtet wird. Dies ist eine etwas optimierte Version derselben Abfrage, die vom Wordpress-Kern selbst ausgeführt wird. Diese filtert den gesamten Müll heraus, den Sie nicht zurückhaben möchten, und gibt Ihnen lediglich eine übersichtliche Liste mit der entsprechenden Autoren-ID, dem Post-Typ, dem Slug und der Sichtbarkeit. Wenn Sie weitere Details benötigen, können Sie diese wie gewohnt mit new \WP_Post($id); abrufen oder eine der anderen nativen Wordpress-Funktionen mit einer der relevanten Tabellenzeilen verwenden, auch außerhalb der Schleife.

Ich verwende ein ähnliches Setup in einigen meiner eigenen benutzerdefinierten Designs und Plugins, und es funktioniert ziemlich gut. Es ist auch sicher und lässt interne Daten nicht im globalen Bereich schweben, wo sie wie die meisten Dinge in Wordpress überschrieben werden können.

0
mopsyd