উত্তর:
গ্লোবাল ভেরিয়েবল ব্যবহার করুন $post
:
<?php
global $post;
$post_slug = $post->post_name;
?>
echo
এটি দরকার । সুতরাং, এটি আদর্শ হবেন:<?php global $post; echo $post->post_name; ?>
$WP_Post
?
অন্যান্য উত্তর হিসাবে, স্লাগ post_name
সম্পত্তি মধ্যে সংরক্ষণ করা হয় । যদিও এটি সরাসরি অ্যাক্সেস করা যেতে পারে, আমি 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
মন্দ নয় , যা আপনি সাধারণত ব্যবহার করেন না এবং প্রায়শই
কোড উদাহরণ দেওয়া, দেখে মনে হচ্ছে আপনার লিঙ্কটি আসলে কী প্রয়োজন need সেক্ষেত্রে আপনি 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');
উত্তরটি এখানে পাওয়া গেল: ওয়ার্ডপ্রেসে বর্তমান পৃষ্ঠার স্লাগ কীভাবে পুনরুদ্ধার করবেন?
@ ম্যাথু বয়েনেস এর আরও উত্তর, আপনি যদি প্যারেন্ট স্লাগ (যদি থাকে তবে) পেতে আগ্রহী হন তবে আমি এই ফাংশনটি দরকারী বলে খুঁজে পেয়েছি:
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' );
আপনি যদি হুডের অধীনে আরও উত্তর চান তবে আপনি যে কোনও পোস্ট, পৃষ্ঠাগুলি বা কাস্টম ট্যাক্সনোমিসহ যে কোনও পোস্ট পেতে পারেন তা সত্ত্বেও নীচের এসকিউএল কোয়েরিটি ব্যবহার করতে পারেন, এমনকি কোনও হুক এখনও অবধি প্রকাশিত হয়নি।
কাঁচা এসকিউএল:
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
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);
এনে আনতে পারেন , বা লুপের বাইরেও, কোনও প্রাসঙ্গিক টেবিল সারি সহ অন্যান্য নেটিভ ওয়ার্ডপ্রেস ফাংশন ব্যবহার করতে পারেন।
আমি আমার নিজস্ব কাস্টম থিম এবং প্লাগইনগুলির মধ্যে একটি অনুরূপ সেটআপ ব্যবহার করি এবং এটি দুর্দান্ত কাজ করে। এটি সুরক্ষিত এবং অভ্যন্তরীণ ডেটা বিশ্বব্যাপী এমন জায়গায় ভাসমান ছেড়ে দেয় না যেখানে ওয়ার্ডপ্রেসের মতো বেশিরভাগ স্টাফের মতো এটি ওভাররাইড করা যায়।
ওয়ার্ডপ্রেসে ডায়নামিক পেজ কলিং।
<?php
get_template_part('foldername/'.basename(get_permalink()),'name');
?>
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>