Wie rufe ich den Block der aktuellen Seite ab?


99

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

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

Antworten:


151

Verwenden Sie die globale Variable $post:

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

3
Danke. Ihre Lösung funktioniert hervorragend. <?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
Ich

1
Wie Sarytasch sagte, müssen Sie echoes tun . Das wäre also ideal:<?php global $post; echo $post->post_name; ?>
its_me


68

Wie in den anderen Antworten angegeben, ist die Schnecke in der Unterkunft gespeichert post_name. Während es könnte direkt zugegriffen werden, ziehe ich die ( zu wenig genutzt) get_post_field()Funktion Post Eigenschaften für den Zugriff auf die für sie keine richtige API haben.

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() );

12
Es ist erwähnenswert, dass, wenn Sie in der Schleife sind, Sie get_post_fieldohne zweites Argument ( docs ) verwenden können
jmarceli

26

5. APRIL 2016 BEARBEITEN

Nach mehr Zuverlässigkeit zu graben, ich tun , endete diese Antwort auf die folgende Stelle , die auf diese bearbeiten führt: ( Achten Sie darauf, check it out )

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 weitere sicherere Alternative zu diesem Problem ist mit get_queried_object()dem dem aktuellen abgefragten Objekt hält die Seite Slug zu erhalten , die von dem gehalten wird post_nameEigentum. Dies kann überall in Ihrer Vorlage verwendet werden.

$postkann verwendet werden, aber es kann als jede benutzerdefinierte Abfrage oder benutzerdefinierten Code unzuverlässig sein kann , den Wert ändern $post, so sollte es außerhalb der Schleife vermieden werden.

Die Verwendung get_queried_object()des Befehls zum Abrufen des aktuellen Seitenobjekts ist wesentlich zuverlässiger und lässt sich mit geringerer Wahrscheinlichkeit ändern, es sei denn, Sie verwenden das Böse, query_postsdas das Hauptabfrageobjekt zerstört. Dann liegt dies ganz bei Ihnen.

Sie können das oben genannte wie folgt verwenden

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

Ich muss sagen, das query_postsist nicht böse, wenn Sie die Hauptabfrage ändern möchten , die Sie jedoch in der Regel nicht und oft missbraucht wird :)
jave.web

11

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

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

2
Dies hängt von den Permalink-Einstellungen ab. Wenn Sie die „einfache“ Einstellung verwenden, werden Links aussehen http://domain/?p=123, die Sie verlassen ?p=123.
Mene

8

Angesichts 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.


4
Dies ist jedoch die vollständige URL, nicht nur der Slug.
Fred

2

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) );
    }
}


0

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

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, sogar vor den Hooks mu_plugins_loadedoder init.

@Hinweis

Dies setzt voraus, dass Sie ein Standard-Datenbankpräfix haben wp_posts. Wenn Sie variable Präfixe berücksichtigen müssen, können Sie die richtige Post-Tabelle ganz einfach über PHP erhalten, 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`;"

Dann läuft entweder mit $wpdb, mysqlioder eine PDOInstanz. 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 abrufennew \WP_Post( get_the_ID() );


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. Dieser 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 new \WP_Post($id);gewohnt mit 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

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.


-1

Dynamischer Seitenaufruf in WordPress.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
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.