जवाबों:
वैश्विक चर का उपयोग करें $post
:
<?php
global $post;
$post_slug = $post->post_name;
?>
echo
। तो, यह आदर्श होगा:<?php global $post; echo $post->post_name; ?>
$WP_Post
?
अन्य उत्तरों के अनुसार, स्लग को post_name
संपत्ति में संग्रहीत किया जाता है। यह एक ओर जहां सकता है सीधे पहुँचा जा, मैं (underused) पसंद करते हैं get_post_field()
पद गुण जो उनके लिए कोई उचित एपीआई है तक पहुँचने के लिए कार्य करते हैं।
यह स्पष्ट रूप से प्रदान की गई पोस्ट की आवश्यकता है और वर्तमान एक के लिए डिफ़ॉल्ट नहीं है, इसलिए वर्तमान पोस्ट के लिए पूर्ण रूप से यह होगा:
$slug = get_post_field( 'post_name', get_post() );
अधिक विश्वसनीयता के लिए खुदाई करने के बाद, मैंने इस उत्तर को निम्नलिखित पोस्ट पर किया, जो इस संपादन की ओर ले जाता है: ( इसे अवश्य देखें )
अब तक का सबसे विश्वसनीय तरीका जो मैं आ सकता था, वह निम्नलिखित है:
// 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% सुनिश्चित हैं कि आपको हर बार सही डेटा मिलता है।
इस समस्या के लिए एक और सुरक्षित विकल्प का उपयोग कर रहा है get_queried_object()
जो उस पृष्ठ को प्राप्त करने के लिए वर्तमान क्वेरिड ऑब्जेक्ट रखता है जो post_name
संपत्ति द्वारा आयोजित किया जाता है। यह आपके टेम्पलेट में कहीं भी उपयोग किया जा सकता है।
$post
उपयोग किया जा सकता है, लेकिन यह अविश्वसनीय हो सकता है क्योंकि किसी भी कस्टम क्वेरी या कस्टम कोड के मूल्य को बदल सकते हैं $post
, इसलिए इसे लूप के बाहर से बचा जाना चाहिए।
get_queried_object()
वर्तमान पृष्ठ ऑब्जेक्ट को प्राप्त करने के लिए उपयोग करना अधिक विश्वसनीय है और इसे संशोधित किए जाने की संभावना कम है, जब तक कि आप उस बुराई का उपयोग नहीं कर रहे हैं query_posts
जो मुख्य क्वेरी ऑब्जेक्ट को तोड़ती है, लेकिन फिर वह सब आप पर निर्भर है।
आप उपरोक्त का उपयोग निम्नानुसार कर सकते हैं
if ( is_page() )
$slug = get_queried_object()->post_name;
query_posts
यह बुराई नहीं है , जो कि आमतौर पर आप नहीं करते हैं और अक्सर इसका दुरुपयोग किया जाता है :)
कोड उदाहरण को देखते हुए, ऐसा लगता है कि आपको वास्तव में क्या चाहिए एक लिंक है। उस स्थिति में, आप get_permalink () का उपयोग कर सकते हैं , जिसका उपयोग लूप के बाहर किया जा सकता है। पोस्ट स्लग का उपयोग करने की तुलना में आपको वही करना चाहिए जो आपको अधिक विश्वसनीय रूप से करना चाहिए।
एक पुराना प्रश्न हो सकता है, लेकिन मैंने आपके उत्तरों के आधार पर फ़ंक्शन 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) );
}
}
यह लूप के बाहर स्लग को पुनः प्राप्त करने के लिए उपयोग करने के लिए फ़ंक्शन है।
get_post_field( 'post_name');
उत्तर यहां मिला: वर्डप्रेस में वर्तमान पृष्ठ के स्लग को कैसे पुनर्प्राप्त करें?
@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' );
यदि आप अधिक अंडर-हूड उत्तर चाहते हैं, तो आप निम्न 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 फ़ंक्शन का उपयोग किसी भी संबंधित तालिका पंक्तियों के साथ, लूप के बाहर भी कर सकते हैं।
मैं अपने स्वयं के कस्टम विषयों और प्लगइन्स के एक जोड़े में एक समान सेटअप का उपयोग करता हूं, और यह बहुत अच्छा काम करता है। यह सुरक्षित भी है और वैश्विक दायरे में इधर-उधर तैरते हुए आंतरिक डेटा को नहीं छोड़ता है, जहां इसे वर्डप्रेस के अधिकांश सामान की तरह ओवरराइड किया जा सकता है।
वर्डप्रेस में डायनामिक पेज कॉलिंग।
<?php
get_template_part('foldername/'.basename(get_permalink()),'name');
?>
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>