আমি কীভাবে বর্তমান পৃষ্ঠার স্লাগ পুনরুদ্ধার করব?


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; ?>
এর_মেট


68

অন্যান্য উত্তর হিসাবে, স্লাগ post_nameসম্পত্তি মধ্যে সংরক্ষণ করা হয় । যদিও এটি সরাসরি অ্যাক্সেস করা যেতে পারে, আমি get_post_field()পোস্ট বৈশিষ্ট্যগুলিতে অ্যাক্সেসের জন্য (আন্ডারউজড) ফাংশনটি পছন্দ করি যার জন্য তাদের জন্য কোনও উপযুক্ত এপিআই নেই।

এটির জন্য স্পষ্টভাবে সরবরাহ করা পোস্টের প্রয়োজন এবং এটি বর্তমানের ডিফল্ট নয়, সুতরাং বর্তমান পোস্টের জন্য এটি সম্পূর্ণ হবে:

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

12
এটি লক্ষণীয় যে আপনি যদি get_post_field
লুপটিতে থাকেন

26

5 এপ্রিল 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% নিশ্চিত যে আপনি প্রতিবার সঠিক ডেটা পাবেন।

মূল উত্তর

এই সমস্যার আর একটি নিরাপদ বিকল্প ব্যবহার করা হচ্ছে get_queried_object()যা পৃষ্ঠা স্লাগ যা post_nameসম্পত্তি দ্বারা রাখা আছে তা পেতে বর্তমান অনুসন্ধান অবজেক্টটিকে ধারণ করে । এটি আপনার টেমপ্লেটের যে কোনও জায়গায় ব্যবহার করা যেতে পারে।

$postব্যবহার করা যেতে পারে, তবে এটি কোনও বিশ্বাসযোগ্য প্রশ্ন যেমন কোনও কাস্টম ক্যোয়ারী বা কাস্টম কোড এর মান পরিবর্তন করতে $postপারে তাই লুপের বাইরে এড়ানো উচিত।

get_queried_object()বর্তমান পৃষ্ঠার অবজেক্টটি পেতে ব্যবহার করা অনেক বেশি নির্ভরযোগ্য এবং পরিবর্তিত হওয়ার সম্ভাবনা কম, যদি না আপনি খারাপ ব্যবহার করেন query_postsযা মূল ক্যোয়ারী অবজেক্টটিকে ভেঙে দেয় তবে তবে এটি আপনার উপর নির্ভর করে ।

আপনি নিম্নলিখিত হিসাবে উপরের ব্যবহার করতে পারেন

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

আমি অবশ্যই বলব যে আপনি যখন মূল জিজ্ঞাসাটি পরিবর্তন করতে চান তবে এটিquery_posts মন্দ নয় , যা আপনি সাধারণত ব্যবহার করেন না এবং প্রায়শই
এটির

11

স্লাগ পাওয়ার সহজ উপায়টি হ'ল:

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

2
এটি পার্মালিঙ্ক সেটিংসের উপর নির্ভর করে। আপনি "সহজ" সেটিং ব্যবহার করলে, লিঙ্ক দেখতে কেমন হবে http://domain/?p=123, সঙ্গে আপনি যাব ?p=123
Mane

8

কোড উদাহরণ দেওয়া, দেখে মনে হচ্ছে আপনার লিঙ্কটি আসলে কী প্রয়োজন need সেক্ষেত্রে আপনি get_permalink () ব্যবহার করতে পারেন , যা লুপের বাইরে ব্যবহার করা যেতে পারে। এটি আপনার পোস্ট স্লাগ ব্যবহারের চেয়ে বেশি নির্ভরযোগ্যতার সাথে করা উচিত।


4
এটি সম্পূর্ণ ইউআরএল, কেবল স্লাগ নয়।
ফ্রেড

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

@ ম্যাথু বয়েনেস এর আরও উত্তর, আপনি যদি প্যারেন্ট স্লাগ (যদি থাকে তবে) পেতে আগ্রহী হন তবে আমি এই ফাংশনটি দরকারী বলে খুঁজে পেয়েছি:

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

আপনি যদি হুডের অধীনে আরও উত্তর চান তবে আপনি যে কোনও পোস্ট, পৃষ্ঠাগুলি বা কাস্টম ট্যাক্সনোমিসহ যে কোনও পোস্ট পেতে পারেন তা সত্ত্বেও নীচের এসকিউএল কোয়েরিটি ব্যবহার করতে পারেন, এমনকি কোনও হুক এখনও অবধি প্রকাশিত হয়নি।

কাঁচা এসকিউএল:


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);এনে আনতে পারেন , বা লুপের বাইরেও, কোনও প্রাসঙ্গিক টেবিল সারি সহ অন্যান্য নেটিভ ওয়ার্ডপ্রেস ফাংশন ব্যবহার করতে পারেন।

আমি আমার নিজস্ব কাস্টম থিম এবং প্লাগইনগুলির মধ্যে একটি অনুরূপ সেটআপ ব্যবহার করি এবং এটি দুর্দান্ত কাজ করে। এটি সুরক্ষিত এবং অভ্যন্তরীণ ডেটা বিশ্বব্যাপী এমন জায়গায় ভাসমান ছেড়ে দেয় না যেখানে ওয়ার্ডপ্রেসের মতো বেশিরভাগ স্টাফের মতো এটি ওভাররাইড করা যায়।


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

এটি সমস্ত পোস্ট, পৃষ্ঠা, কাস্টম রুটের জন্য কাজ করে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.