কাস্টম পোস্ট ধরণের পোস্ট URL গুলি থেকে স্লাগ সরান


48

দেখে মনে হচ্ছে যে সমস্ত ওয়েব সংস্থান কাস্টম পোস্ট টাইপ স্লাগ মুছে ফেলার বিষয়ের উপর ভিত্তি করে

yourdomain.com/CPT-SLUG/post-name 

এখন খুব পুরানো সমাধানগুলি প্রায়শই প্রাক ডাব্লুপি সংস্করণ 3.5 ইনস্টল উল্লেখ করে। একটি সাধারণ হল:

'rewrite'   => array( 'slug' => false, 'with_front' => false ),  

আপনার নিবন্ধের_পোস্ট_প্রকার ফাংশনের মধ্যে। এটি আর কাজ করে না এবং বিভ্রান্তিকর হয়। তাই আমি ওয়ার্ডপ্রেস 5 এর প্রান্তে Q3 2018 তে সম্প্রদায়কে জিজ্ঞাসা করছি ...

পুনর্লিখনের তর্ক বা অন্য কোথাও থেকে কাস্টম পোস্ট টাইপের পোস্টের ইউআরএল থেকে পোস্ট টাইপ স্লাগ সরানোর আধুনিক এবং দক্ষ উপায়গুলি কী?

আপডেট: রিজেক্সের সাথে এটি কাজ করতে বাধ্য করার বেশ কয়েকটি উপায় রয়েছে বলে মনে হয়। বিশেষত জ্যান বেকের উত্তর থেকে আপনার কোনও বিতর্কিত পৃষ্ঠা / পোস্টের নাম তৈরি না হয় তা নিশ্চিত করতে কনটেন্ট তৈরির নিরীক্ষণ করতে অবিচ্ছিন্ন থাকতে হবে .... তবে আমি নিশ্চিত যে ডাব্লুপি কোর এটি আমাদের জন্য পরিচালনা করা উচিত যেখানে এটি একটি প্রধান দুর্বলতা is । সিপিটি তৈরি করার সময় একটি বিকল্প / হুক হিসাবে উভয় বা পারমালিক্সের জন্য বিকল্পগুলির একটি উন্নত সেট। ট্র্যাক টিকেট সমর্থন করুন।

পাদটীকা: দয়া করে এই ট্র্যাকের টিকিটটিকে দেখে / প্রচার করে এটি সমর্থন করুন: https://core.trac.wordpress.org/ticket/34136# টিকেট


আমি অনুমান করি যে আমি আমার মাথা আঁচড় দিচ্ছি আপনি কেন এটি করতে চান? বিভ্রান্ত।
মাইকেল একলুন্ড

3
@ মিশেলএক্লুন্ড কারণ যে কোনও সিপিটি যা জনসাধারণের মুখোমুখি ওয়েব পৃষ্ঠাগুলি তৈরি করতে ব্যবহৃত হয় তার URL টিতে জোর করে স্লাগ নাম রয়েছে। সুরক্ষিতভাবে স্লাগটি সরিয়ে দেওয়ার জন্য সেখানে অনেকগুলি ডাব্লুপিপি ডেভস রয়েছে s
বেন র্যাকিকোট

উত্তর:


60

নিম্নলিখিত কোডটি কাজ করবে, তবে আপনাকে কেবল মনে রাখতে হবে যে আপনার কাস্টম পোস্ট ধরণের স্লাগ কোনও পৃষ্ঠা বা পোস্টের স্লাগের মতো হলেই সংঘাতগুলি সহজেই ঘটতে পারে ...

প্রথমে, আমরা পার্লিমিংক থেকে স্লাগটি সরিয়ে ফেলব:

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( 'events' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

কেবল স্লাগ অপসারণই যথেষ্ট নয়। এখনই, আপনি একটি 404 পৃষ্ঠা পাবেন কারণ ওয়ার্ডপ্রেস কেবল পোস্ট এবং পৃষ্ঠাগুলি এই জাতীয় আচরণের প্রত্যাশা করে। আপনাকে নিম্নলিখিতগুলি যুক্ত করতে হবে:

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'events', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'na_parse_request' );

আপনার কাস্টম পোস্ট ধরণে কেবল "ইভেন্টগুলি" পরিবর্তন করুন এবং আপনি যেতে ভাল। আপনাকে আপনার পারমিলিকগুলি রিফ্রেশ করতে হবে।


ধন্যবাদ। আপনি কি মনে করেন ম্যানুয়ালি পুনরায় লেখাগুলি তৈরি করার চেয়ে এটি ভাল? আমি সেই সমাধানটি দেখেছি এবং এটি আপনি উপসাগরে যে দ্বন্দ্বগুলি উল্লেখ করেছেন তা রাখতে পারে?
বেন র্যাকিকোট 13

1
এটি nginx এ ব্যর্থ হয়েছে কারণ শর্ত 2 != count( $query->query )। এনজিনেক্সের সাহায্যে আপনার কাছে $ ক্যোয়ারী-> কোয়েরি থাকতে পারে array('page' => '', 'name' => '...', 'q' => '...')। সুতরাং @ নেটএলেন, এই শর্তটির অর্থ কী?
ফ্যাবিও মন্টেফুস্কোলো

3
আমাদের এর চেয়ে আরও ভাল কিছু দরকার। অন্তর্নির্মিত স্লাগটি সরিয়ে দেওয়ার জন্য সমর্থন যাতে আমরা পরে বিরোধী URL গুলি তৈরি করতে না পারি। যেভাবে নিয়মিত পোস্ট এবং পৃষ্ঠাগুলি তাদের ইউআরএল তৈরি করে।
বেন র্যাকিকট

3
এটি কি কেবলমাত্র আমি বা এটি কিছু ওয়ার্ডপ্রেস শর্তাধীন ট্যাগ যেমন_সেনসেল () এবং ইস_সিংসুলার () এর মতো ব্রেক করে?
রব-গর্ডন

1
দুর্ভাগ্যক্রমে এই সমাধানটির ফলে কিছু ভাঙা লিঙ্ক হয়েছে এবং আমার ব্লগ পোস্টগুলি দেখা বন্ধ করে দিয়েছে এবং এটি একটি সাধারণ পৃষ্ঠা। নীচে ম্যাট কীগুলির দ্বারা আরও ভাল সমাধান দেখুন।
র‌্যাডলি সাস্টায়ার

20

বিভাগের রেজিস্ট্রেশনে নিম্নলিখিত কোড লিখুন।

'rewrite' => [
  'slug' => '/',
  'with_front' => false
]

কোড পরিবর্তন করার পরে আপনাকে সবচেয়ে গুরুত্বপূর্ণ বিষয়টি করতে হবে

আপনি নিজের কাস্টম পোস্টের ধরণী দস্তাবেজটি পরিবর্তন করার পরে, সেটিংস> পারমলিক্সে যাওয়ার চেষ্টা করুন এবং আপনার সেটিংস পুনরায় সংরক্ষণ করুন , অন্যথায় আপনি 404 পৃষ্ঠা খুঁজে পাবেন না।

সর্বোত্তম সমাধানের জন্য এখানে চেক করুন: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/


এটি আসলে কাজ করে, আমি জানি না যে এটি আগে কেউ কীভাবে লক্ষ্য করেছে। অবশ্যই এটি অন্যান্য পৃষ্ঠাগুলিতে হস্তক্ষেপ করতে পারে যদি তাদের একই পারমিলিংক থাকে তবে তা না হলে এটি দুর্দান্ত সমাধান।
আলেকসান্দার Đorđević

4
এটি চেষ্টা করে দেখেছি। এটি আমার কাস্টম পোস্ট ধরণের লিঙ্কগুলির জন্য পছন্দসই ফলাফল দেয়। তবে এটি সমস্ত পোস্ট বা পৃষ্ঠার পোস্ট ধরণের স্লাগগুলি 'ক্যাচ' করে এবং আমার কাস্টম পোস্টের টাইপের জন্য URL হিসাবে তাদের সমাধান করার চেষ্টা করে, তারপরে 404 গুলি। (হ্যাঁ আমি পারমালিঙ্কস সংরক্ষণ করেছি)।
ম্যাট কীগুলি

4
এটি কাজ করে না। আপনি পারমালিক্স আপডেট করলেও 404 দেয়।
ক্রিস্টিন কুপার

3
আবার,
পারমিলিংক

1
এই সমাধানটি ইউআরএল থেকে স্লাগ অপসারণের জন্য কাজ করে। কিন্তু সংরক্ষণাগার পৃষ্ঠাগুলি আর কাজ করে না।
অন্নপূর্ণা

13

আমি এটি খুব বেশি আগে খুঁজে বের করার চেষ্টা করেছি এবং আমি যা জানি তা থেকে সংক্ষিপ্ত উত্তরটি নেই । কমপক্ষে পুনর্লিখনের যুক্তির মধ্যে থেকে নয়।

register_post_typeআপনি ডাব্লুপি-অন্তর্ভুক্ত / পোস্ট.এফপি লাইন 1454 এর আসল কোডটি দেখলে দীর্ঘ ব্যাখ্যাটি স্পষ্ট হয়ে ওঠে :

add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );

আপনি $args->rewrite['slug']এটি %$post_type%পুনরায় লেখার ট্যাগের উপসর্গগুলি দেখতে পাচ্ছেন । কেউ ভাবতে পারে null"যতক্ষণ না আপনি কয়েকটি লাইন সন্ধান করেন না" ততক্ষণ "আসুন কেবল তখন স্লাগ সেট করুন ":

if ( empty( $args->rewrite['slug'] ) )
    $args->rewrite['slug'] = $post_type;

আপনি দেখতে পারেন যে ফাংশনটি সর্বদা একটি স্লাগ মান প্রত্যাশা করে যা খালি নয় এবং অন্যথায় পোস্টের ধরণটি ব্যবহার করে।


ধন্যবাদ @ জ্যানবেক এর অস্তিত্ব থাকার বড় কারণ আছে কি? এই নিয়ম থেকে নির্দিষ্ট পোস্টের প্রকার বাদ দিতে শর্তাধীন এই মূল ফাইলটিকে হ্যাক করবেন না কেন?
বেন র্যাকিকোট

9
আপনার উত্তর জ্যান বেককে দেওয়া উচিত। অনুরোধগুলি সঠিকভাবে রুট করতে ওয়ার্ডপ্রেসের পোস্ট_ টাইপ স্লাগ দরকার। এই নিয়মটি নেটিভ ডাব্লুপি পৃষ্ঠাগুলির মধ্যে নামকরণ বিরোধগুলি (যা স্লাগ ব্যতীত রেন্ডার করে) এবং কোনও কাস্টম সংজ্ঞায়িত পোস্ট ধরণের প্রতিরোধ করে। আপনি যদি স্লগ আউট হ্যাক করেন তবে ওয়ার্ডপ্রেস "পিকনিক" নামে একটি পৃষ্ঠা এবং "পিকনিক" নামে একটি ইভেন্টের (কাস্টম পোস্টের ধরণের) পার্থক্য জানতে পারবে না।
dswebsme

3
@ ডিডওবসমে সম্মত, কিন্তু এমন পরিস্থিতি রয়েছে যেখানে আপনাকে অবশ্যই URL টি পরিবর্তন করতে হবে। আপনি কেন স্থানীয়ভাবে না পারছেন এবং না করা উচিত তা বাদে আপনি কীভাবে দক্ষতার সাথে এটি করেন?
বেন র্যাকিকোট 13

7

আমার পূর্ববর্তী উত্তরের প্রতিক্রিয়া : আপনি কোনও নতুন পোস্টের নিবন্ধন rewriteকরার falseসময় অবশ্যই প্যারামিটার সেট করতে পারেন এবং পুনরায় লেখার নিয়মগুলি নিজের মতো করে পরিচালনা করতে পারেন

<?php
function wpsx203951_custom_init() {

    $post_type = 'event';
    $args = (object) array(
        'public'      => true,
        'label'       => 'Events',
        'rewrite'     => false, // always set this to false
        'has_archive' => true
    );
    register_post_type( $post_type, $args );

    // these are your actual rewrite arguments
    $args->rewrite = array(
        'slug' => 'calendar'
    );

    // everything what follows is from the register_post_type function
    if ( is_admin() || '' != get_option( 'permalink_structure' ) ) {

        if ( ! is_array( $args->rewrite ) )
            $args->rewrite = array();
        if ( empty( $args->rewrite['slug'] ) )
            $args->rewrite['slug'] = $post_type;
        if ( ! isset( $args->rewrite['with_front'] ) )
            $args->rewrite['with_front'] = true;
        if ( ! isset( $args->rewrite['pages'] ) )
            $args->rewrite['pages'] = true;
        if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
            $args->rewrite['feeds'] = (bool) $args->has_archive;
        if ( ! isset( $args->rewrite['ep_mask'] ) ) {
            if ( isset( $args->permalink_epmask ) )
                $args->rewrite['ep_mask'] = $args->permalink_epmask;
            else
                $args->rewrite['ep_mask'] = EP_PERMALINK;
        }

        if ( $args->hierarchical )
            add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
        else
            add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );

        if ( $args->has_archive ) {
            $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
            if ( $args->rewrite['with_front'] )
                $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
            else
                $archive_slug = $wp_rewrite->root . $archive_slug;

            add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
            if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
                add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
                add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
            }
            if ( $args->rewrite['pages'] )
                add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
        }

        $permastruct_args = $args->rewrite;
        $permastruct_args['feed'] = $permastruct_args['feeds'];
        add_permastruct( $post_type, "%$post_type%", $permastruct_args );
    }
}
add_action( 'init', 'wpsx203951_custom_init' );

আপনি add_permastructকলটি দেখতে পাবেন এখন আর স্লগ অন্তর্ভুক্ত নয়। আমি দুটি পরিস্থিতি পরীক্ষা করেছি:

  1. আমি যখন স্লাগ "ক্যালেন্ডার" দিয়ে একটি পৃষ্ঠা তৈরি করি তখন সেই পৃষ্ঠাটি পোস্ট ধরণের সংরক্ষণাগার দ্বারা ওভাররাইট করা হয় যা "ক্যালেন্ডার" স্লাগও ব্যবহার করে।

এখানে চিত্র বর্ণনা লিখুন

  1. আমি যখন স্লাগ "আমার ইভেন্ট" এবং স্লগ "আমার ইভেন্ট" সহ একটি ইভেন্ট (সিপিটি) দিয়ে একটি পৃষ্ঠা তৈরি করি, তখন কাস্টম পোস্টের ধরণটি প্রদর্শিত হয়।

এখানে চিত্র বর্ণনা লিখুন

  1. অন্য কোনও পৃষ্ঠাও কাজ করে না। আপনি যদি উপরের ছবিটি দেখেন তবে এটি স্পষ্ট হয়ে যায় কেন: কাস্টম পোস্ট ধরণের নিয়মটি সর্বদা একটি পৃষ্ঠ স্লাগের সাথে মেলে। যেহেতু ওয়ার্ডপ্রেস শনাক্ত করার কোনও উপায় নেই যদি এটি কোনও পৃষ্ঠা বা কাস্টম পোস্ট টাইপ নেই যা বিদ্যমান নেই, তবে এটি 404 ফেরত আসবে That's এজন্য পৃষ্ঠা বা সিপিটি হয় তা সনাক্ত করার জন্য আপনার স্লাগ প্রয়োজন। একটি সম্ভাব্য সমাধান হ'ল ত্রুটিটিকে বাধা দেওয়া এবং এমন একটি পৃষ্ঠা সন্ধান করা যা এই উত্তরের অনুরূপ হতে পারে ।

সুতরাং যদি লক্ষ্যটি সিপিটি-র জন্য স্লাগটি সরিয়ে ফেলা হয় তবে আমরা কি সিপিটিকে এমন কোনও অনন্যর নাম বলতে পারি না যেটি সংঘটিত হবে না কারণ এটি আর ইউআরএলে কখনও দেখা যাবে না? অথবা পোস্টের নামটি কি কোনও পেজ হিসাবে একই নামকরণ করা হলে দ্বন্দ্ব সম্ভব?
বেন র্যাকিকোট

আমি আমার উত্তর আপডেট করে দেখিয়েছি যে এটি আসলে সমস্ত পৃষ্ঠাগুলি ভেঙে দেয় । কোনও স্লাগ ছাড়াই, ডাব্লুপি একটি পৃষ্ঠার পরিবর্তে সিপিটি সন্ধান করবে এবং যদি এটি খুঁজে না পায় তবে একটি ত্রুটি ফিরিয়ে দিন। সুতরাং এটি আসলে পোস্টের সাথে সম্পর্কিত নয়।
জান বেক

1
আমি দেখি. ভবিষ্যতের মতবিরোধী URL এর নেটিভ ডাব্লুপি পোস্ট বনাম পৃষ্ঠাগুলির মতো '-1' যুক্ত করে পুনরায় লেখার নিয়ম থাকতে হবে। আমি একটি ট্র্যাক টিকিট কোর তৈরি করেছি ।
বেন র্যাকিকোট 23

7

এখানে উত্তরগুলি অনুসন্ধান করে আমি মনে করি যে আরও ভাল সমাধানের জন্য আরও জায়গা রয়েছে যা আমি উপরে শিখেছি এমন কিছু জিনিসকে একত্রিত করে এবং সদৃশ পোস্ট স্লাগগুলির স্বতঃ-সনাক্তকরণ এবং প্রতিরোধ যুক্ত করে।

দ্রষ্টব্য: নিশ্চিত করুন যে আপনি নীচে আমার উদাহরণ জুড়ে নিজের নিজস্ব সিপিটি নামের জন্য 'কাস্টম_পোস্ট_প্রকার' পরিবর্তন করেছেন। অনেকগুলি ঘটনা রয়েছে, এবং 'অনুসন্ধান / প্রতিস্থাপন' হ'ল এগুলিকে ধরার একটি সহজ উপায়। এই কোডের সমস্ত আপনার ফাংশন.ফ্প বা একটি প্লাগইনে যেতে পারে।

পদক্ষেপ 1: আপনি পোস্টটি নিবন্ধিত করার সময় 'মিথ্যা' এ পুনরায় লেখক সেট করে আপনার কাস্টম পোস্টের ধরণের পুনর্লিখনগুলি অক্ষম করুন:

register_post_type( 'custom_post_type',
    array(
        'rewrite' => false
    )
);

পদক্ষেপ 2: ম্যানুয়ালি আমাদের কাস্টম_পোস্ট_ টাইপের জন্য ওয়ার্ডপ্রেস পুনরায় লেখার নীচে আমাদের কাস্টম পুনরায় লেখাগুলি যুক্ত করুন

function custom_post_type_rewrites() {
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)(?:/([0-9]+))?/?$', 'index.php?custom_post_type=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
}
add_action( 'init', 'custom_post_type_rewrites' );

দ্রষ্টব্য: আপনার প্রয়োজনের উপর নির্ভর করে আপনি উপরের পুনর্লিখনগুলি সংশোধন করতে পারেন (ট্র্যাকব্যাকগুলি অক্ষম করবেন? ফিডস? ইত্যাদি)। এগুলি 'ডিফল্ট' টাইপের পুনরায় লেখার প্রতিনিধিত্ব করে যা উত্পন্ন হত যদি আপনি পদক্ষেপ 1 এ পুনরায় লেখাগুলি অক্ষম না করে থাকেন

পদক্ষেপ 3: আপনার কাস্টম পোস্টের ধরণের আবার 'চমত্কার' করতে পারমিলিংক তৈরি করুন

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && 'custom_post_type' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( 'post_type_link', 'custom_post_type_permalinks', 10, 3 );

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

পদক্ষেপ 4: সদৃশ পোস্ট স্লাগগুলি প্রতিরোধ করুন

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        'post',
        'page',
        'custom_post_type'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( 'custom_post_type' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, 'OBJECT', 'post' );
        $page_match = get_page_by_path( $slug, 'OBJECT', 'page' );

        if ( $post_match || $page_match ) {
            $slug .= '-duplicate';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' );

        if ( $custom_post_type_match ) {
            $slug .= '-duplicate';
        }
    }

    return $slug;
}
add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 );

দ্রষ্টব্য: এটি কোনও সদৃশ স্লাগের শেষে 'ডুপ্লিকেট' স্ট্রিং যুক্ত করবে। এই কোডটি সদৃশ স্লাগগুলিকে এই সমাধানটি প্রয়োগের আগে থেকেই উপস্থিত থাকলে প্রতিরোধ করতে পারে না। প্রথমে সদৃশগুলি পরীক্ষা করার জন্য নিশ্চিত হন।

আমি অন্য কারও কাছ থেকে এটি শুনতে আগ্রহী, যিনি এটিকে যাচ্ছেন তা দেখার জন্য যদি এটি তাদের জন্যও ভালভাবে কাজ করে।


এটি কেবল পরীক্ষা করে দেখে মনে হচ্ছে এটি এখন পর্যন্ত কাজ করছে।
ক্রিস্টিন কুপার

এই পদ্ধতির জন্য আশাবাদী ছিল, তবে আমার সিপিটি পোস্টগুলিতে পেরামালিংকগুলি পুনরায় রাখার পরেও আমাকে একটি 404 দেয়।
গারকনিস

দুঃখিত, এটি আপনার জন্য কার্যকর হয়নি গারকনিস। আমি কিছুক্ষণ আগে এই সম্পর্কে অন্য কারও সাথে কথা বলছিলাম এবং তাদের সাইটে এটি নিয়েও তাদের সমস্যা ছিল। আমি মনে করি মনে হয় আপনার ব্লগ পোস্টের পারমলিংকের উপর যদি একটি উপস থাকে it ব্লগ পোস্টগুলির জন্য আমি এটি বিকাশ করা সাইটগুলিতে পারমালিঙ্ক কাঠামো ব্যবহার করা হচ্ছে: / ব্লগ /% পোস্ট নাম% /। আপনার ব্লগ পোস্টগুলিতে যদি আপনার উপসর্গ না থাকে এবং আপনি এটি গ্রহণযোগ্য হন তবে এটি চেষ্টা করে দেখুন এবং এটি কীভাবে যায় তা আমাকে জানান!
ম্যাট কীগুলি

2
এটি আমার পক্ষে কাজ করেছে। পৃষ্ঠার অন্যান্য সমাধানগুলির থেকে পৃথক, এটি সাধারণ পৃষ্ঠাগুলি বা ব্লগ বিন্যাসটি ভাঙেনি এবং অসীম পুনঃনির্দেশের কারণ ঘটেনি। এমনকি এই সিপিটি পৃষ্ঠাগুলি সম্পাদনা করার সময় এটি "পারমালিঙ্ক" অঞ্চলে সঠিক URL টি দেখায়। এখানে বেশ ভাল সমাধান, কেবলমাত্র সতর্কতা হল সংরক্ষণাগার পৃষ্ঠাটি কাজ করে না। "কাস্টম_পোস্ট_টাইপ" সরিয়ে আউট এবং পরে আপনার পারমিলিকগুলি রিফ্রেশ করতে মনে রাখবেন ।
র‌্যাডলি সাস্টায়ার

@ ম্যাটকিজ, ডিফল্ট পার্মালিঙ্ক সেটিংসের একটি কাস্টম স্ট্রাকচার রয়েছে /%category%/%postname%/। আপনার কোড যুক্ত করার সময়, সিপিটি স্লাগগুলি দেখতে ঠিক আছে (যদিও পিছনের স্ল্যাশ অনুপস্থিত) ... এবং সংঘাতের পরীক্ষকও কাজ করে। তবে আসল পোস্টের ফলাফল 404
গারকনিস

1

আপনার এত হার্ড-কোড দরকার নেই। কেবল লাইটওয়েট প্লাগইন ব্যবহার করুন:

এটিতে কাস্টমাইজযোগ্য বিকল্প রয়েছে।


এখন আমি জানি কেন আপনি নিম্নচাপে পড়েছেন, এটি সাধারণ পৃষ্ঠা লিঙ্কগুলি সমাধান করতে বাধা দেয়। আমি তা দেখতে পাইনি কারণ সতেজ হওয়া সত্ত্বেও আমি বিদ্যমান পৃষ্ঠাগুলির ক্যাশে অনুলিপি পাচ্ছি।
ওয়ালফ

@ ওয়াল্ফ আপনি কি আমাকে বিবরণে সমস্যাটি বলতে পারেন?
টুডো

প্রধান মেনু থেকে পৃষ্ঠাগুলির লিঙ্কগুলি (যা কাস্টম পোস্টের ধরণ ছিল না) 404 ত্রুটি দিয়েছে, যেন পৃষ্ঠাটির অস্তিত্ব নেই; এটাই.
ওয়াল্ফ

@ ওয়াল্ফ আপনি কি আমাকে আপনার অনুষ্ঠানের কোনও উদাহরণ url দিতে পারেন? (আপনি চাইলে ডোমেনের নামটি কভার করতে পারেন, আমার কেবল একটি উদাহরণ উদাহরণ প্রয়োজন) ধন্যবাদ, আমি এটি আপডেট করব
T.Todua

1

এখানেও একই সমস্যা ছিল এবং মনে হয় ওয়ার্ডপ্রেস সাইটে কোনও গতি নেই। আমার বিশেষ পরিস্থিতিতে যেখানে একক ব্লগপোস্টগুলির কাঠামো / ব্লগ /% পোস্টনাম% / এর জন্য এই সমাধানটির প্রয়োজন ছিল

https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/

404s একটি গুচ্ছ শেষ

তবে একসাথে এই দুর্দান্ত পদ্ধতির সাথে, যা ব্লগপোস্টের জন্য ব্যাকএন্ড পারমলিংক স্ট্রুকচার ব্যবহার করছে না এটি শেষ পর্যন্ত আকর্ষণীয়ের মতো কাজ করে। https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

একটি গুচ্ছ ধন্যবাদ।


0

এবং আমরা উপরে উল্লিখিত ফাংশনটিতে কিছু পরিবর্তন করতে পারি:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {
    $query->set( 'post_type', array( 'post', 'events', 'page' ) );
}
}

প্রতি:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {

    global $wpdb;
    $pt = $wpdb->get_var(
        "SELECT post_type FROM `{$wpdb->posts}` " .
        "WHERE post_name = '{$query->query['name']}'"
    );
    $query->set( 'post_type', $pt );
}
}

ডান post_type মান সেট করতে।



0

যে কারও কাছে এটি পড়ার ক্ষেত্রে শিশুদের পোস্টে সমস্যা হয়েছিল আমি খুঁজে পেলাম তার সেরা পুনর্লিখনের নিয়মগুলি যুক্ত করার সেরা উপায়।

আমার যে প্রধান সমস্যাটি ছিল তা হ'ল ওয়ার্ডপ্রেস 2 স্তরের (চাইল্ড পোস্ট) পৃষ্ঠাগুলি থেকে পুনর্নির্দেশকে 3 স্তরের গভীর (শিশু পোস্টের শিশু) বিবেচনা করার চেয়ে কিছুটা আলাদাভাবে আচরণ করে ats

এর অর্থ যখন আমার / পোস্ট-টাইপ / পোস্ট-নাম / পোস্ট-চাইল্ড / আমি / পোস্ট-নাম / পোস্ট-চাইল্ড ব্যবহার করতে পারি এবং এটি আমার সামনে পোস্ট-টাইপ সহ একটিতে পুনর্নির্দেশ করবে তবে আমার পোস্ট-টাইপ থাকলে / পোস্ট-নাম / পোস্ট-চাইল্ড / পোস্ট-নাতি-নাত তবে আমি পোস্ট-নাম / পোস্ট-চাইল্ড / পোস্ট-নাতনি ব্যবহার করতে পারি না।

পুনর্লিখনের নিয়মগুলিতে এক নজরে দেখে মনে হচ্ছে এটি প্রথম এবং দ্বিতীয় স্তরের পৃষ্ঠার নাম ব্যতীত অন্য কোনও জিনিসের সাথে মেলে (আমার মনে হয় দ্বিতীয় স্তরের সংযুক্তি মেলে) এবং তারপরে আপনাকে যথাযথ পোস্টে পুনঃনির্দেশ করার জন্য সেখানে কিছু করে। তিন স্তরে গভীরভাবে এটি কাজ করে না।

আপনার প্রথমে যে কাজটি করা দরকার তা হ'ল বাচ্চাদের থেকে পোস্টের ধরণের লিঙ্কও সরিয়ে ফেলা। উপরের নাট অ্যালেনের উত্তরের দিকে নজর দিলে এই যুক্তিটি এখানে হওয়া উচিত:

$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

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

পরবর্তী পদক্ষেপটি যেখানে দেওয়া উত্তর থেকে জিনিসগুলি পরিবর্তিত হয়। মূল ক্যোয়ারিতে জিনিসগুলি যুক্ত করার পরিবর্তে (যা কাস্টম পোস্ট এবং তাদের শিশুদের জন্য কাজ করেছিল তবে পরবর্তী শিশুদের জন্য নয়) আমি একটি পুনর্লিখন যুক্ত করেছি যা ওয়ার্ডপ্রেস নিয়মের নীচে গিয়েছিল যাতে পৃষ্ঠার নাম চেক আউট না হলে এবং এটি প্রায় 404-এ আঘাত করুন এটি কাস্টম পোস্ট ধরণের কোনও পৃষ্ঠার একই নাম আছে তা না হলে এটি 404 টি ছুঁড়ে ফেলবে কিনা তা শেষ চেক করে do

আমি এখানে 'ইভেন্ট' ধরে নিয়ে পুনরায় লেখার নিয়মটি ব্যবহার করেছি এটি আপনার সিপিটির নাম

function rewrite_rules_for_removing_post_type_slug()
{
    add_rewrite_rule(
        '(.?.+?)?(:/([0-9]+))?/?$',
        'index.php?event=$matches[1]/$matches[2]&post_type=event',
        'bottom'
    );
}

add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);

আশা করি এটি অন্য কাউকে সহায়তা করে, আমি চাইল্ড পোস্টের সন্তানের সাথে সম্পর্কিত এবং এর থেকে স্লাগটি সরিয়ে নিয়ে অন্য কোনও কিছু করতে পারি না।


রেজেক্সে একটি টাইপো আছে বলে মনে হচ্ছে। '(:' A '?' এর মধ্যে এটিকে ক্যাপচারিং সাব-প্যাটার্ন => '(?:' হিসাবে ব্যবহার করা প্রয়োজন The তৃতীয়? এটি ফাঁকা প্রথম সাবপ্যাটার্নকে অনুমতি দেয় বলে ভুল জায়গায় স্থানান্তরিত বলে মনে হচ্ছে ably সম্ভবত এটি (এবং: এর মধ্যে অবস্থান করা উচিত)। । এই টাইপো ছাড়া অভিব্যক্তি এক বিল্ড-ইন পোস্টের প্রকারের 'পৃষ্ঠা' এর জন্য পাওয়া যাবে, যা একই হবে যেমন
একফোঁটা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.