বিভিন্ন কাস্টম পোস্ট ধরণের মধ্যে পিতামাতার সন্তানের সম্পর্ক কীভাবে সেট করবেন


14

আমি সবেমাত্র একটি পোস্ট টাইপ "এপিসোডস" এবং একটি পোস্টের ধরণের "কার্টুন-সিরিজ" এর মধ্যে একটি পোস্ট / পিতামাতার সম্পর্ক স্থাপন করেছি।

আমি এই বিট কোডটি অন্য পোস্টের প্রকার থেকে পিতামাতাকে নিয়োগের জন্য মেটা বাক্সে যুক্ত করতে ব্যবহার করেছি:

add_action('admin_menu', function() {
    remove_meta_box('pageparentdiv', 'episodes', 'normal');
});
add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
    } // end hierarchical check.
}

এটি পর্বে অভিভাবক হিসাবে আমাকে সিরিজটি সেট করার অনুমতি দেওয়ার জন্য অ্যাডমিন স্ক্রিনে কাজ করেছে, কিন্তু যখন আমি পোস্টটি দেখার চেষ্টা করি তখন আমি একটি 404 পাই The ইউআরএল কাঠামোটি হ'ল:

domain/episodes/series-name/episode-name

সিরিজের url হ'ল:

domain/cartoon-series/series-name

আমি পর্বটির url চাই:

domain/cartoon-series/series-name/episode-name

আমি কী মিস করছি? পুরো পোস্ট টাইপ করা অন্য পোস্ট টাইপের সন্তানের পক্ষে তৈরি করা কি সম্ভব? সুতরাং, আমি এমনকি পর্বগুলির তালিকাটির url পেতে পারি:

domain/cartoon-series/series-name/episodes

ধন্যবাদ! ঔজ্বল্যহীন


অনুরোধ হিসাবে, প্রশ্নে দুটি কাস্টম পোস্ট ধরণের কোড এখানে:

$labels = array(
    "name" => "Cartoon Series",
    "singular_name" => "Cartoon Series",
    "menu_name" => "Cartoon Series",
    "all_items" => "All Cartoon Series",
    "add_new" => "Add New",
    "add_new_item" => "Add New Cartoon Series",
    "edit" => "Edit",
    "edit_item" => "Edit Cartoon Series",
    "new_item" => "New Cartoon Series",
    "view" => "View",
    "view_item" => "View Cartoon Series",
    "search_items" => "Search Cartoon Series",
    "not_found" => "No Cartoon Series Found",
    "not_found_in_trash" => "No Cartoon Series Found in Trash",
    "parent" => "Parent Cartoon Series",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "cartoon-series", $args );

$labels = array(
    "name" => "Episodes",
    "singular_name" => "Episode",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "episodes", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "episodes", $args );

আমি সিপিটি ইউআই প্লাগইন ব্যবহার করছি, তাই আমি সেই কোডটি সরাসরি সম্পাদনা করতে পারি না। এটি কেবল এক্সপোর্ট কোড সিপিটি ইউআই সরবরাহ করে।

আমার কাছে অন্য কোনও কোড নেই যা দুটি সিপিটি সংযুক্ত করে। হয়তো এটাই আমি মিস করছি। আমি সবেমাত্র সেই কোডটি অনলাইনে পেয়েছি যা লিঙ্কটি করতে পৃষ্ঠায় মেটাবক্স স্থাপন করে। কাজটা কি যথেষ্ট নয়? দেখে মনে হচ্ছে এটি পোস্ট_পিতা সেট করে।

ধন্যবাদ! ঔজ্বল্যহীন


আমি দুঃখিত কিন্তু আমি ভুল ছিল। পিতা-মাতার সন্তানের সম্পর্কটি সঠিকভাবে সেট করা আছে। মেটা বাক্স কোনও মেটা ক্ষেত্র ব্যবহার করছে না (এটিই আমাকে প্রথম বিভ্রান্ত করেছিল), এটি parent_idক্যোয়ারী ভেরি ব্যবহার করে এবং সম্পর্ক স্থাপনের জন্য কোডের বেশি প্রয়োজন হয় না। সমস্যাটি হ'ল উত্পন্ন URL টি ওয়ার্ডপ্রেস দ্বারা স্বীকৃত নয়। আমি পুনর্লিখনের নিয়মটি সন্ধান করার চেষ্টা করেছি যা এটি কার্যকর হয় তবে আমার সফলতা হয়নি। আমি এখন একটি সমাধান তদন্ত করছি।
সাইবমেটা

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

আমি মনে করি যে একটি হাইরিচিকাল পোস্ট টাইপ আপনার পরিস্থিতি পুরোপুরি ফিট করে।
সাইবমেটা

2
আমি সত্যিই চেষ্টা করছি এটির সাথে জটিল না হওয়ার। যদি আরও মার্জিত সমাধান পাওয়া যায় তবে আমি সমস্ত কান। আমি সাধারণভাবে ডব্লিউপি-তে নতুন এসেছি এবং এখন পর্যন্ত বেশ ভাল অভিনয় করেছি, তবে এটি আমাকে আটকে রেখেছে। সাধারণত, আমি কেবল কার্টুন সিরিজকে একটি বিভাগ তৈরি করব এবং এপিসোডে সেট করব। সমস্যাটি হ'ল, কার্টুন সিরিজের অধীনে যাওয়ার জন্য আমার কাছে এপিসোড ছাড়া অন্য নেস্টেড ডেটাও রয়েছে। সুতরাং, দেখে মনে হচ্ছে কার্টুন সিরিজের পাশাপাশি সিপিটি হওয়াও দরকার। এটা জটিল! :-D আপনি কেবলমাত্র একটি শ্রেণিবদ্ধ পোস্ট টাইপ ব্যবহার করে আপনার অর্থ বোঝাতে পারেন?
ম্যাটটোন

উত্তর:


9

অবশেষে আমি একটি কার্যকরী সমাধান খুঁজে পেয়েছি। কার্টুন-সিরিজ নিবন্ধিত করা যেতে পারে তুমি করেছ কিন্তু পর্বের কাস্টম পোস্ট ধরনের hirarchical হতে পারে না (আমি ওয়ার্ডপ্রেস আশা পিতা বা মাতা বিষয়বস্তু শিশু সামগ্রী হিসাবে একই ধরনের যদি সম্পর্ক ব্যবহার করে নির্ধারণ করা হচ্ছে মনে post_parentমধ্যে wp_postsডাটাবেস সারণি)।

নিবন্ধনের পর্ব লেখা নিয়ম স্লাগ্ যদি আপনি চান সেট থাকা উচিত, তখন যে cartoon-series/%series_name%। তারপরে আমরা কার্টুন-সিরিজের পোস্ট টাইপের অনুরোধ করা হয় এবং কখন একটি এপিসোড হয় তখন ওয়ার্ডপ্রেসকে বলতে %series_name%পিতামাতার cartoon-seriesপোস্টের প্রকৃত নাম এবং পুনর্লিখনের নিয়মের সাথে প্রতিস্থাপনের জন্য এপিসোডগুলির লিঙ্কটি ফিল্টার করতে পারি।

add_action('init', function(){
    $labels = array(
        "name" => "Cartoon Series",
        "singular_name" => "Cartoon Series",
        "menu_name" => "Cartoon Series",
        "all_items" => "All Cartoon Series",
        "add_new" => "Add New",
        "add_new_item" => "Add New Cartoon Series",
        "edit" => "Edit",
        "edit_item" => "Edit Cartoon Series",
        "new_item" => "New Cartoon Series",
        "view" => "View",
        "view_item" => "View Cartoon Series",
        "search_items" => "Search Cartoon Series",
        "not_found" => "No Cartoon Series Found",
        "not_found_in_trash" => "No Cartoon Series Found in Trash",
        "parent" => "Parent Cartoon Series",
    );

    $args = array(
        "labels" => $labels,
         "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => true,
        "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "cartoon-series", $args );

    $labels = array(
        "name" => "Episodes",
        "singular_name" => "Episode",
    );

    $args = array(
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "cartoon-series/%series_name%", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "episodes", $args );

});

add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
}

add_action( 'init', function() {

    add_rewrite_rule( '^cartoon-series/(.*)/([^/]+)/?$','index.php?episodes=$matches[2]','top' );

});

add_filter( 'post_type_link', function( $link, $post ) {
    if ( 'episodes' == get_post_type( $post ) ) {
        //Lets go to get the parent cartoon-series name
        if( $post->post_parent ) {
            $parent = get_post( $post->post_parent );
            if( !empty($parent->post_name) ) {
                return str_replace( '%series_name%', $parent->post_name, $link );
            }
        } else {
            //This seems to not work. It is intented to build pretty permalinks
            //when episodes has not parent, but it seems that it would need
            //additional rewrite rules
            //return str_replace( '/%series_name%', '', $link );
        }

    }
    return $link;
}, 10, 2 );

দ্রষ্টব্য : উপরের কোডটি সংরক্ষণ করার পরে এবং চেষ্টা করার আগে পুনরায় লেখার নিয়মগুলি ফ্লাশ করতে ভুলবেন না। যান wp-admin/options-permalink.phpএবং লেখা নিয়ম regerenate সংরক্ষণ ক্লিক করুন।

দ্রষ্টব্য 2 : সম্ভবত এমন যে আরও পুনর্লিখনের বিধিগুলি যুক্ত করতে হবে, উদাহরণস্বরূপ প্যাগিনেট পোস্টগুলির জন্য কাজ করা। এছাড়াও সম্পূর্ণ সমাধানের জন্য এটি আরও কিছু কাজের প্রয়োজন হতে পারে, উদাহরণস্বরূপ, মুছে cartoon-seriesফেলার সময় সমস্ত শিশু পর্বও মুছে ফেলা হবে? পোস্ট পিতা বা মাতা দ্বারা পর্বগুলি ফিল্টার করতে প্রশাসক সম্পাদনা স্ক্রিনে একটি ফিল্টার যুক্ত করবেন? প্যারেন্ট সিরিজের নামটি দেখতে অ্যাডমিন সম্পাদনা স্ক্রিনে পর্বের শিরোনামটি সংশোধন করবেন?


এটি দেখার জন্য ধন্যবাদ! দেখে মনে হচ্ছে আপনার পোস্ট করা কোডটি ইউআরএল থেকে কার্টুন সিরিজের নাম বাদ দিচ্ছে। % সিরিজ_নাম% কে পর্বের নামের সাথে প্রতিস্থাপনের পরিবর্তে,% সিরিজ_নাম% পর্বের পিতামাতার নাম হওয়া উচিত। পর্বের নামটি তার পরে হবে। কোনও কারণে কার্টুন সিরিজ বাক্সটি পিতামাতাকে বেছে নেওয়ার জন্য আমার পক্ষে জনপ্রিয় নয়। সে কারণেই আমি ভেবেছিলাম পর্বগুলি শ্রেণিবদ্ধ হওয়া দরকার। কেন তা বোঝার চেষ্টা করছি।
ম্যাটটোন

হ্যাঁ, কার্টুন সিরিজ মেটা বক্সটি জনপ্রিয় করার জন্য পর্বগুলি হায়ারারিকাল হতে হবে।
ম্যাটাতন

পর্বগুলি শ্রেণিবদ্ধ সহ যাতে আমি পিতামাতাকে সেট করতে পারি, ইউআরএলটি আরও খারাপ হয়ে গেছে। আপনার পরামর্শ মতো স্লাগের সাথে আমি সিরিজের নামটি url এ দুবার পেয়েছি। সুতরাং, domain/episodes/series-name/episode-nameআগের মতো পরিবর্তে , আমি পেয়েছিdomain/episodes/series-name/series-name/episode-name
ম্যাটাতন

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

আহ, আমার ক্ষমা, আমি দ্রুত স্ক্যান করেছিলাম এবং ভাবছিলাম যে অংশটি একই ছিল। আপনি ঠিক বলেছেন, পৃষ্ঠাটি এখন লোড হচ্ছে এবং ইউআরএলটি সঠিক দেখাচ্ছে।
ম্যাটটোন

1

এই ক্ষেত্রে হার্ড-কোডিংয়ের দরকার নেই ... আপনি কেবল এই প্লাগইনটি ব্যবহার করতে পারেন:

https://wordpress.org/plugins/add-hierarchy-parent-to-post/

আপনি এটি থেকে কোড দখল করতে পারেন। তবে এটি সম্পূর্ণ সমাধান নাও হতে পারে।


-1

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

এটি এমন কিছু নয় যা ওয়ার্ডপ্রেসের পুনর্লিখনের নিয়ম এপিআই দিয়ে করা খুব সহজ, তবে এমন কোনও কিছুই নেই যা আপনাকে পুনরায় লেখার প্রক্রিয়াটিকে বাইপাস করা এবং নিজের দ্বারা ইউআরএলগুলি পার্স করা বাধা দেয়। ওয়ার্ডপ্রেস পুনরায় লেখার নিয়ম চালান like যদি কোনও সামগ্রী খুঁজে পাওয়া যায় এবং এটি প্রস্থান করে 2 টি ইউআরএল এর প্রথম অংশটি পান, প্রত্যাশিত পোস্ট প্রকারের সাথে স্লাগের সাথে মিলিত কোনও পোস্ট আছে কিনা তা পরীক্ষা করে দেখুন the ইউআরএলটির বাকি অংশগুলিতে লুপ পোস্টগুলি বিদ্যমান কিনা তা যাচাই করে সঠিক টাইপ। ৪. যদি সবকিছু মিল হয় তবে শেষের পোস্টটি পাওয়া যায়, অন্যথায় 404 পৃষ্ঠা প্রদর্শন করুন

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