Geçerli sayfanın fişini nasıl alabilirim?


99

Geçerli WordPress sayfasının fişini döngünün dışına çıkarmaya çalışıyorum. Sayfanın başlığı ile döner wp_title (), ancak sümüklü böcek nasıl alabilirim?

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

Yanıtlar:


151

Global değişkeni kullanın $post:

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

3
Teşekkür ederim. Çözümünüz harika çalışıyor. Sadece sümüklü böcek yankı gerekir:<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
sarytash

1
Sarytash'ın dediği gibi, ihtiyacın echovar. Yani, bu ideal olacaktır:<?php global $post; echo $post->post_name; ?>
its_me

Ne hakkında $WP_Post?
Peter Mortensen

68

Diğer cevaplara göre, sümüklü böcek post_namemülkte saklanır . O iken olabilir doğrudan erişilebilir, ben (kapatacağı) tercih get_post_field()onlar için doğru API sonrası özelliklerini erişmek için işlev.

Açıkça sağlanan gönderiyi gerektirir ve mevcut yazıya varsayılan olarak gelmez, dolayısıyla geçerli yazı için tam olarak şöyle olacaktır:

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

12
Döngü get_post_field
içindeyseniz

26

EDIT 5 NİSAN 2016

Daha fazla güvenilirlik için kazıdan sonra, bu cevabı şu düzenlemeye götüren aşağıdaki yazıya yaptım : ( Bunu kontrol ettiğinizden emin olun )

Bugüne kadar bulabildiğim en güvenilir yöntem aşağıdaki gibidir:

// 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;

Bu şekilde, her seferinde doğru veriyi aldığınızdan% 99.9999 emin olursunuz.

ORİJİNAL CEVAP

Bu soruna bir diğer daha güvenli alternatif get_queried_object(), post_namemülkiyet tarafından tutulan sayfa fişini almak için mevcut sorgulanan nesneyi tutanı kullanmaktır . Bu, şablonunuzun herhangi bir yerinde kullanılabilir.

$postkullanılabilir, ancak herhangi bir özel sorgu veya özel kodun değerini değiştirebileceği için güvenilmez olabilir $post, bu nedenle döngü dışından kaçınılmalıdır.

Kullanılması get_queried_object()Geçerli sayfa nesnesini almak için çok daha güvenilir olduğunu ve kötülüğü kullandığınız sürece, değiştirilemez olasılığı daha düşüktür query_postsana sorgu nesnesi kırar, ama sonra hepsi size kalmış.

Yukarıdaki gibi kullanabilirsiniz

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

Asıl sorguyu değiştirmek istediğinizdequery_posts bunun kötü olmadığını söylemeliyim, bununla birlikte genellikle sık sık kullanmazsınız ve yanlış kullanılır :)
jave.web 3:18

11

Sümüklü böcek almanın basit yolu şudur:

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

2
bu, kalıcı bağlantı ayarlarına bağlıdır. Eğer "basit" ayarını kullanırsanız, linkler http://domain/?p=123sizi bırakarak görünür ?p=123.
Mene

8

Kod örneği göz önüne alındığında, gerçekten ihtiyacınız olan bir bağlantı gibi görünüyor. Bu durumda, döngünün dışında kullanılabilecek get_permalink () işlevini kullanabilirsiniz . Bu, sümüklü böcek kullanmaktan daha güvenilir bir şekilde ihtiyacınız olanı yapmalı.


4
Bu tam URL, sadece sümüklü böcek değil.
Fred

2

Eski bir soru olabilir, ancak cevaplarınıza göre get_the_slug () ve the_slug () fonksiyonlarını oluşturdum.

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

Sadece @Matthew Boynes cevabını daha ileri götürün, eğer ebeveyn sümüklü böcek (eğer varsa) almakla ilgileniyorsanız, bu fonksiyonu faydalı buldum:

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

Örneğin sümüklü böcekleri ana sınıfa eklemek için:

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

Daha fazla başlık altında bir cevap istiyorsanız, daha önce hiç kanca kullanılmamış olsa bile, herhangi bir zamanda mesaj, sayfa veya özel taksonomi olan tüm gönderileri almak için aşağıdaki SQL sorgusunu kullanabilirsiniz.

Ham 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`;

Bu bile önce, hatta fonksiyonları dosyanın ilk satırında çalışan mu_plugins_loadedveya initkancalar.

@Not

Bu, standart bir veritabanı önekine sahip olduğunuz varsayılmaktadır wp_posts. Değişken önekleri hesaba katmanız gerekirse, aşağıdakileri yaparak PHP ile doğru posta tablosunu kolayca alabilirsiniz:

<?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`;"

Sonra biriyle çalışacak $wpdb, mysqliya da bir PDOörneği. Bu sorguda kullanıcı girişi olmadığından, içine herhangi bir değişken enjekte etmediğiniz sürece hazırlanmış bir ifade olmadan çalışmak güvenlidir.

Bunu bir sınıfın özel statik değeri olarak saklamanızı öneririm, böylece en iyi performans için sorguyu sayfa başına bir defadan fazla tekrar ateşlemek zorunda kalmadan erişilebiliyor:

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

kullanım

$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
}

Sen özü aldın. Daha fazla ayrıntıya ihtiyaç duyarsanız, normalnew \WP_Post( get_the_ID() );


Bu, wordpress döngüsü isteğinizi kabul edilebilir bulduğu bir noktaya ulaşmasa bile mesajları istediğiniz zaman kontrol etmenizi sağlar. Bu, Wordpress çekirdeğinin kendisi tarafından çalıştırılan aynı sorgunun biraz daha optimize edilmiş bir sürümüdür. Bu, iade edilmesini istemediğiniz önemsiz tüm filtreleri filtreler ve ilgili yazar kimliği, posta türü, sümüklü böcek ve görünürlük ile ilgili size güzel bir şekilde düzenlenmiş bir liste sunar. Daha fazla ayrıntıya ihtiyaç duyuyorsanız, bunları normal olarak alabilir new \WP_Post($id);veya diğer yerel Wordpress işlevlerinden herhangi birini, ilgili tablo satırlarından herhangi biriyle, hatta döngünün dışında bile kullanabilirsiniz.

Kendi özel temalarım ve eklentilerimden birkaçında benzer bir kurulum kullanıyorum ve çok iyi çalışıyor. Aynı zamanda güvenlidir ve Wordpress'teki çoğu şey gibi geçersiz kılınabileceği global kapsamda dolaşan dahili verileri bırakmaz.


0

Dürüstçe anlamıyorum ki cevapların hiçbiri neden yapmıyor:

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

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

Bu, tüm gönderiler, sayfalar, özel yollar için çalışır.


-1

WordPress'te Dinamik Sayfa çağırma.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.