मैं वर्तमान पृष्ठ का स्लग कैसे निकालूं?


99

मैं लूप के बाहर वर्तमान वर्डप्रेस पेज के स्लग को पुनः प्राप्त करने का प्रयास कर रहा हूं। पृष्ठ का शीर्षक साथ लौटता है wp_title (), लेकिन मैं स्लग कैसे प्राप्त कर सकता हूं?

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

जवाबों:


151

वैश्विक चर का उपयोग करें $post:

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

3
धन्यवाद। आपका समाधान महान काम करता है। बस स्लग को प्रतिध्वनित करने की आवश्यकता है:<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
सरताश

1
जैसे सरिताश ने कहा, आपको इसकी जरूरत है echo। तो, यह आदर्श होगा:<?php global $post; echo $post->post_name; ?>
इसका_मेरा

किस बारे में $WP_Post?
पीटर मोर्टेंसन

68

अन्य उत्तरों के अनुसार, स्लग को post_nameसंपत्ति में संग्रहीत किया जाता है। यह एक ओर जहां सकता है सीधे पहुँचा जा, मैं (underused) पसंद करते हैं get_post_field()पद गुण जो उनके लिए कोई उचित एपीआई है तक पहुँचने के लिए कार्य करते हैं।

यह स्पष्ट रूप से प्रदान की गई पोस्ट की आवश्यकता है और वर्तमान एक के लिए डिफ़ॉल्ट नहीं है, इसलिए वर्तमान पोस्ट के लिए पूर्ण रूप से यह होगा:

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

12
यह ध्यान देने योग्य है कि यदि आप लूप में हैं तो आप get_post_fieldदूसरे तर्क ( डॉक्स ) के बिना उपयोग कर सकते हैं
jmarceli

26

EDIT 5 APRIL 2016

अधिक विश्वसनीयता के लिए खुदाई करने के बाद, मैंने इस उत्तर को निम्नलिखित पोस्ट पर किया, जो इस संपादन की ओर ले जाता है: ( इसे अवश्य देखें )

अब तक का सबसे विश्वसनीय तरीका जो मैं आ सकता था, वह निम्नलिखित है:

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

इस तरह, आप 99.9999% सुनिश्चित हैं कि आपको हर बार सही डेटा मिलता है।

मूल ANSWER

इस समस्या के लिए एक और सुरक्षित विकल्प का उपयोग कर रहा है get_queried_object()जो उस पृष्ठ को प्राप्त करने के लिए वर्तमान क्वेरिड ऑब्जेक्ट रखता है जो post_nameसंपत्ति द्वारा आयोजित किया जाता है। यह आपके टेम्पलेट में कहीं भी उपयोग किया जा सकता है।

$postउपयोग किया जा सकता है, लेकिन यह अविश्वसनीय हो सकता है क्योंकि किसी भी कस्टम क्वेरी या कस्टम कोड के मूल्य को बदल सकते हैं $post, इसलिए इसे लूप के बाहर से बचा जाना चाहिए।

get_queried_object()वर्तमान पृष्ठ ऑब्जेक्ट को प्राप्त करने के लिए उपयोग करना अधिक विश्वसनीय है और इसे संशोधित किए जाने की संभावना कम है, जब तक कि आप उस बुराई का उपयोग नहीं कर रहे हैं query_postsजो मुख्य क्वेरी ऑब्जेक्ट को तोड़ती है, लेकिन फिर वह सब आप पर निर्भर है।

आप उपरोक्त का उपयोग निम्नानुसार कर सकते हैं

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

मुझे कहना चाहिए कि जब आप मुख्य क्वेरी को बदलना चाहते हैं तोquery_posts यह बुराई नहीं है , जो कि आमतौर पर आप नहीं करते हैं और अक्सर इसका दुरुपयोग किया जाता है :)
jave.web

11

स्लग प्राप्त करने का सरल तरीका है:

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

2
यह पर्मलिंक सेटिंग्स पर निर्भर करता है। आप "सरल" सेटिंग का उपयोग करते हैं, तो लिंक की तरह दिखाई देगा http://domain/?p=123, साथ छोड़ ?p=123
मेने

8

कोड उदाहरण को देखते हुए, ऐसा लगता है कि आपको वास्तव में क्या चाहिए एक लिंक है। उस स्थिति में, आप get_permalink () का उपयोग कर सकते हैं , जिसका उपयोग लूप के बाहर किया जा सकता है। पोस्ट स्लग का उपयोग करने की तुलना में आपको वही करना चाहिए जो आपको अधिक विश्वसनीय रूप से करना चाहिए।


4
यह पूर्ण URL है, हालांकि केवल स्लग नहीं है।
फ्रेड

2

एक पुराना प्रश्न हो सकता है, लेकिन मैंने आपके उत्तरों के आधार पर फ़ंक्शन get_the_slug () और the_slug () बनाए हैं।

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

1

यह लूप के बाहर स्लग को पुनः प्राप्त करने के लिए उपयोग करने के लिए फ़ंक्शन है।

get_post_field( 'post_name');

उत्तर यहां मिला: वर्डप्रेस में वर्तमान पृष्ठ के स्लग को कैसे पुनर्प्राप्त करें?


दरअसल, लेकिन आपको दूसरे तर्क के रूप में पोस्ट के $ पोस्ट या आईडी को पास करना होगा।
ट्रेनोआसिस

0

@Matthew Boynes जवाब पर बस आगे, यदि आप माता-पिता के स्लग प्राप्त करने में रुचि रखते हैं (यदि कोई है) तो मैंने भी इस फ़ंक्शन को उपयोगी पाया है:

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

शरीर के वर्ग में स्लग (ओं) को जोड़ने के लिए:

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

यदि आप अधिक अंडर-हूड उत्तर चाहते हैं, तो आप निम्न 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`;

यह आपके फ़ंक्शंस फ़ाइल की पहली पंक्ति पर, यहां तक ​​कि mu_plugins_loadedया initहुक से पहले भी काम करता है ।

@ध्यान दें

यह मान लिया गया है कि आपके पास एक मानक डेटाबेस उपसर्ग है wp_posts। यदि आपको चर उपसर्गों के लिए खाते की आवश्यकता है, तो आप निम्न के द्वारा आसानी से PHP के माध्यम से सही पोस्ट टेबल प्राप्त कर सकते हैं:

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

तो फिर या तो साथ चलाने $wpdb, mysqli, या एक PDOउदाहरण। चूंकि इस क्वेरी में कोई उपयोगकर्ता इनपुट नहीं है, इसलिए यह बिना किसी तैयार किए स्टेटमेंट को चलाने के लिए सुरक्षित है जब तक कि आप इसमें किसी भी वैरिएबल को इंजेक्ट नहीं करते हैं।

मैं इसे एक वर्ग के निजी स्थिर मूल्य के रूप में संग्रहीत करने का सुझाव दूंगा, इसलिए इसे सर्वश्रेष्ठ प्रदर्शन के लिए प्रति पृष्ठ एक से अधिक बार फिर से क्वेरी को फायर किए बिना पहुँचा जा सकता है, कुछ इस तरह से:

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

प्रयोग

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

आप गिस करें। यदि आपको और विवरण की आवश्यकता है, तो आप उन्हें सामान्य रूप से प्राप्त कर सकते हैंnew \WP_Post( get_the_ID() );


यह आपके पोस्ट को किसी भी समय चेक करने देगा, भले ही वर्डप्रेस लूप एक बिंदु पर हिट नहीं हुआ हो, जहां यह आपके अनुरोध को स्वीकार करने योग्य पाता है। यह वर्डप्रेस कोर द्वारा चलाए जा रहे एक ही क्वेरी का थोड़ा और अधिक अनुकूलित संस्करण है। यह एक जंक के सभी फ़िल्टर करता है जिसे आप वापस नहीं करना चाहेंगे, और बस आपको संबंधित लेखक आईडी, पोस्ट प्रकार, स्लग और दृश्यता के साथ एक अच्छी तरह से संगठित सूची प्रदान करता है। यदि आपको और अधिक विवरणों की आवश्यकता है, तो आप उन्हें सामान्य रूप से प्राप्त कर सकते हैं new \WP_Post($id);, या किसी भी अन्य मूल Wordpress फ़ंक्शन का उपयोग किसी भी संबंधित तालिका पंक्तियों के साथ, लूप के बाहर भी कर सकते हैं।

मैं अपने स्वयं के कस्टम विषयों और प्लगइन्स के एक जोड़े में एक समान सेटअप का उपयोग करता हूं, और यह बहुत अच्छा काम करता है। यह सुरक्षित भी है और वैश्विक दायरे में इधर-उधर तैरते हुए आंतरिक डेटा को नहीं छोड़ता है, जहां इसे वर्डप्रेस के अधिकांश सामान की तरह ओवरराइड किया जा सकता है।


0

मैं ईमानदारी से समझ में नहीं आता कि कोई भी उत्तर बस क्यों नहीं करता है:

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

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

यह सभी पोस्ट, पेज, कस्टम रूट के लिए काम करता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.