ওয়ার্ডপ্রেস 3.3 /% পোস্টনাম% / পারমাস্ট্রাক্ট সহ কাস্টম পোস্ট টাইপ?


9

অনুরূপ শিরোনাম সহ আগের পোস্ট রয়েছে, তবে এটি ওয়ার্ডপ্রেস ৩.৩-তে সন্ধান করে না, এবং এটি গুরুত্বপূর্ণ কারণ ৩.৩ আকর্ষণীয়ভাবে বিজ্ঞাপন দেয়: "পারফরম্যান্স পেনাল্টি ছাড়াই পোস্ট নেম পারমালিঙ্ক কাঠামোটি ব্যবহার করুন"

ওয়ার্ডপ্রেস 3.2 এবং এর আগের সমস্যাটি হ'ল এটি প্রথমে পৃষ্ঠার নামগুলি দেখেছিল এবং পরে 404 It অন্যদিকে ৩.৩ অবশ্যই পোস্টের ধরণ, পৃষ্ঠাগুলি এবং অবশেষে ৪০৪ টি দেখতে হবে (যেমন এটি এই বৈশিষ্ট্যটির বিজ্ঞাপন দেয়)। এটি বোঝায় যে স্লাগ ছাড়াই কাস্টম পোস্টের প্রকারগুলি সহজ হওয়া উচিত , যদি তারা post_type=postকোথাও হার্ড কোড না করে ।

যদিও আমি এখনও একটি 3.3 নির্দিষ্ট সমাধান খুঁজে পাচ্ছি না।

প্রশ্ন : আমি প্রদত্ত যে কোনও কাস্টম পোস্ট ধরণের "xyz" এর জন্য পার্মালিঙ্ক স্ট্রাক্ট "/% পোস্টনাম% /" কীভাবে সংজ্ঞায়িত করতে পারি?

ধন্যবাদ।


আমি কোন প্রশ্ন দেখছি না - আপনি আসলে কী জিজ্ঞাসা করছেন?
ট্র্যাভিস নর্থক্যাট

স্পষ্টতার জন্য, আপনি একটি নতুন কাস্টম পোস্ট টাইপ সংজ্ঞায়িত করতে চান যা /% পোস্টনাম% / এর পারমালিঙ্ক কাঠামো ব্যবহার করে? আপনি কি পোস্টগুলি নিয়ে একই পরিকল্পনা করতে ব্যবহার করার পরিকল্পনা করছেন, বা তাদের কি উপসর্গ থাকবে?
সুন্দরবায়ম্প

কেউ উত্তর নিয়ে আসে কিনা তা দেখতে এটি অনুসরণ করে। আমি '/' তে পুনরায় লেখার স্লাগটি সেট করার পাশাপাশি উপরের পন্থাগুলিও খুব চেষ্টা করেছি যা পৃষ্ঠা পার্মলিংকগুলিও ভেঙে দেয়। লে দীর্ঘশ্বাস ...

উত্তর:


2

ডাব্লুপি ৩.৩ এ সহজে করা যায় না যদি আপনি পুনরায় লেখার নিয়মগুলি সঠিক স্থানে না থাকে এবং ডাব্লুপি_উইরাইটকে ভাবেন না যে সামনের প্রান্তে ভার্বোজ বিধিগুলি ব্যবহৃত হচ্ছে। নীচের ক্লাসটি কাজ করে।

class Test_Post_Type {
    const POST_TYPE = 'test';

    public static function init() {
        global $wp_rewrite;

        $post_type_obj = register_post_type( self::POST_TYPE, array(
            'labels' => array(
                'name' => __( 'Tests' ),
                'singular_name' => __( 'Test' ),
                'add_new' => __( 'Add New' ),
                'add_new_item' => __( 'Add New Test' ),
                'edit_item' => __( 'Edit Test' ),
                'new_item' => __( 'New Test' ),
                'all_items' => __( 'All Tests' ),
                'view_item' => __( 'View Test' ),
                'search_items' => __( 'Search Tests' ),
                'not_found' => __( 'No Tests found' ),
                'not_found_in_trash' => __( 'No Tests found in Trash' ),
                'menu_name' => __( 'Tests' )
            ),
            'publicly_queryable' => true,
            'exclude_from_search' => true,
            'hierarchical' => false,
            'public' => true,
            'rewrite' => false,
            'has_archive' => true,
            'supports' => array( 'title', 'editor', 'thumbnail', 'test_source' ),
            'taxonomies' => array( 'category', 'post_tag' ),
        ) );

        $post_type_obj = get_post_type_object(self::POST_TYPE);

        //register the rewrite tag for permalink building
        $wp_rewrite->add_rewrite_tag( '%' . $post_type_obj->query_var . '%', '([^/]+)', $post_type_obj->query_var . '=' );

        //we have to add the permastruct here in order to build the permalink, otherwise we'll need to filter the post_type link
        add_permastruct(self::POST_TYPE, '%' . $post_type_obj->query_var . '%/', false );

        //add a filter to remove the permastructs generated above
        add_filter(self::POST_TYPE . '_rewrite_rules', array(__CLASS__, '_remove_default_rules')); 

        //now we add a filter to put the generated rewrite rules in the correct spot
        add_action('generate_rewrite_rules', array(__CLASS__, '_filter_rewrite_rules'));

        if(!is_admin()) {
            //we need verbose_page_rules to be on on the front end in order for pages to be process properly
            $wp_rewrite->use_verbose_page_rules = true;
        }
    }

    /**
     * Filter to remove the rules for this post type when they're automatically generated due to the permastruct registration
     * @param type $rules
     * @return type 
     */
    public static function _remove_default_rules($rules) {
        return array();
    }

    /**
     * Filters the rules at the end to add back the ones for this post type at the bottom
     * @param WP_Rewrite $wp_rewrite 
     */
    public static function _filter_rewrite_rules($wp_rewrite) {
        $post_type_obj = get_post_type_object(self::POST_TYPE);
        $my_rules = $wp_rewrite->generate_rewrite_rules('%' . $post_type_obj->query_var . '%', EP_NONE);
        $wp_rewrite->rules += $my_rules;
    }

}

add_action( 'init', array( 'Test_Post_Type', 'init' ) );

অনুলিপিটি পুনরায় লেখার নিয়মগুলি ফ্লাশ করে আমার থিমটিতে এই কোডটি আটকানো হয়েছে। একটি নতুন পোস্ট যুক্ত হয়েছে, পোস্টটি দেখেছে (url সঠিক), ডাব্লুপি 3.3.1 এ একটি 404 ... পেয়েছে। কোনও ধারণা কেন এটি আমার পক্ষে কাজ করবে না? (কোড বিটিডব্লিউর জন্য ধন্যবাদ!)
রব ভার্মীর

মন্তব্য পৃষ্ঠাতে কাজ করার জন্য EP_NONE -> EP_PERMALINK এবং তারপরে /% পোস্টনাম% এর সাথে একাধিক পোস্ট ধরণের কাজ করতে / আপনাকে অবশ্যই পার্স_কিউইরি ফিল্টার ব্যবহার করতে হবে। আমার উত্তর উপরে দেখুন।
সায়েন্টিক

রব, আপনি একটি নতুন পোস্ট যুক্ত করেছেন বা একটি নতুন 'পরীক্ষা' পোস্ট যুক্ত করেছেন? পোস্টগুলিতে /% post_name% / এর পারমাস্ট্রাকচার থাকতে হবে কিনা তা মূল প্রশ্নে এটি পরিষ্কার ছিল না। যদি তা হয় তবে কেন নতুন পোস্ট টাইপ তৈরি করবেন? এছাড়াও, যদি একাধিক পোস্ট ধরণের একই পারমাস্ট্রাকচার থাকে তবে আপনার নাম দ্বন্দ্ব নিয়ে সম্ভাব্য সমস্যা থাকবে।
সুন্দরবায়ম্প

1

পবিত্র গাড়ির চাবি!

আমি মনে করি এটি কাজ করে । এটি প্রায় কাজ করে, এটি অত্যন্ত সহজ, কেবল একটি লাইন:

global $wp_rewrite;
$args = array(
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => array('slug' => 'anything'),
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail')
);
register_post_type('my_custom_post_type', $args);

$wp_rewrite->add_permastruct('my_custom_post_type', "%my_custom_post_type%");

পিএস আপনি যদি ঘরে বসে এটি চেষ্টা করেন তবে এই এক লাইনটি যুক্ত করার পরে "সেটিংস" -> "পারমালিঙ্কস" এ যান এবং পরিবর্তনগুলি সংরক্ষণ করুন, এটি পারমালিঙ্কগুলি রিফ্রেশ করে।

আমি ডাব্লুপি register_post_type()উত্স কোডটি পড়ছিলাম এবং একটি লাইন পেয়েছিলাম:

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

বলা বাহুল্য কিন্তু স্লাগ্ ছাড়া আমি এটা কাজ করা উচিত পরিশেষে, এবং তা । এমনকি সম্পাদকের শিরোনামের নীচে পার্মালিঙ্ক সম্পাদনা সঠিকভাবে কাজ করে!

আপডেট: এটি পৃষ্ঠার লঙ্ঘনগুলি ব্রেক করে, অঙ্কন বোর্ডে ফিরে ...


অনুরূপ ফলাফল সহ আমি এটিও চেষ্টা করেছিলাম। এটি কাজ করবে খুব শীতল হবে। অন্য কারও ধারণা থাকতে পারে?
রব ভার্মীর

@ রবর্মার লক্ষ করেছেন যে লাইনটি ছাড়াই (কেবলমাত্র ডিফল্ট স্লাগ সহ) ওয়ার্ডপ্রেস ইতিমধ্যে ইউআরএলে পুনঃনির্দেশ করতে সক্ষম। যেমন "কিছু-পোস্ট" "কিছু / কিছু-পোস্ট" এ পুনঃনির্দেশ করে। কোডপিকে, কোডটিতে কোথাও কোথাও সিপিটি-র জন্য সমর্থন রয়েছে স্লাগ ছাড়াই এটি পুনর্নির্দেশের জন্য ডিফল্ট। মুখের তালু
সিয়েন্টিক

1

গতকাল আমি যেভাবে পেয়েছিলাম প্রায় একই উত্তর, তবে আমি এতে সন্তুষ্ট নই। সুন্দরবায়ম্পের উত্তরের একটি ত্রুটি রয়েছে, যখন /% পোস্টনাম% / একাধিক পোস্ট ধরণের ক্ষেত্রে এক সাথে ব্যবহার করা হয় তখন তা কার্যকর হয় না।

এখানে আমার উত্তর, যা বর্তমান কাঠামোতেও সন্ধান করে এবং ফ্যালব্যাকে পোস্ট ধরণের অ্যারে তৈরি করে। যদিও এর মধ্যে একটি ত্রুটি রয়েছে, যদি দুটি পোস্ট ধরণের একই স্লাগ থাকে এবং উভয়ই /% পোস্টের নাম% / হয় তবে এটি উভয়ই দেখায়।

class MyCustomPostType {
    /**
     * Register post type
     **/
    public static function register_post_type() {
        global $wp_rewrite;

        $args = array(
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'query_var' => true,
            'rewrite' => false,
            'capability_type' => 'post',
            'has_archive' => true,
            'hierarchical' => false,
            'menu_position' => null,
            'supports' => array('title','editor','thumbnail')
        );

        register_post_type('my_custom_post_type', $args);

        // Enables the pages to work simultaneously
        $wp_rewrite->use_verbose_page_rules = true;
        add_filter("rewrite_rules_array", array(__CLASS__, 'rewrite_rules_array'));
        add_action("parse_query", array(__CLASS__, 'parse_query'));
        add_filter("post_type_link", array(__CLASS__, 'post_type_link'), 1, 4);
    }

    public static function post_type_link($link, $post, $leavename=false, $sample=false) {
        if ($sample && ($begin = strpos($link, "?my_custom_post_type=")) !== false) {
            return substr($link, 0, $begin-1) . "/%my_custom_post_type%/";
        }
        return str_replace("?my_custom_post_type=", "", $link) . "/";
    }

    public static function parse_query($query) {
        global $wp, $wp_rewrite;

        // Is this query for /%post_name%/? Is it main request query?
        if (isset($query->query['name'])
            && substr($wp->matched_rule, 0, 7) == "([^/]+)"
            && isset($query->query)
            && isset($wp->query_vars)
            && $query->query == $wp->query_vars)
        {
            //echo '<p><h1>hit!</h1></p>';
            if (!($post_types = get_query_var("post_type"))) {
                if ($wp_rewrite->permalink_structure == "/%postname%/")
                    $post_types = array("post");
                else
                    $post_types = array();
            }

            if (is_array($post_types))
                $post_types[] = "my_custom_post_type";

            set_query_var("post_type", $post_types);
            //set_query_var("posts_per_page", 1);
        }
    }

    public static function rewrite_rules_array($array) {
        global $wp_rewrite;
        // Same rules as in /%post_name%/
        return array_merge($array, $wp_rewrite->generate_rewrite_rules("/%postname%/", EP_PERMALINK));
    }
}


add_action('init', array("MyCustomPostType", "register_post_type"));

এটা কি নির্দিষ্ট পোস্ট-টাইপগুলি শ্রেণিবদ্ধ হতে পারে? আমি নিজেকে চেষ্টা করেছি, কিন্তু কিছুই কাজ বলে মনে হয় ... এটা মনে পোস্টের সাথে একটি সংযুক্তি হয় পিতা বা মাতা / সন্তানের / ... যদি আমি কি বাবা-মা / শিশু / নাতি / এটি পায় একটি 404.
রব Vermeer

1

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

add_action('init', 'firmasite_resimlitarif_cpt', 0);
function firmasite_resimlitarif_cpt() 
{

// Yemek Tarifi

  $args = array(
    'public' => true,
    'show_in_menu' => true, 
    'permalink_epmask' => EP_NONE,
    'rewrite' => array('slug'=>'/','with_front'=>false),
    'has_archive' => false,
    'supports' => array('title','editor','thumbnail')
  ); 
  register_post_type('yemek',$args);

}


// http://wordpress.stackexchange.com/questions/37650/wordpress-3-3-custom-post-type-with-postname-permastruct
add_action("parse_query", 'firmasite_resimlitarif_parse_query');
function firmasite_resimlitarif_parse_query($query) {
    global $wp, $wp_rewrite;


    // Is this query for /%post_name%/? Is it main request query?
    if (isset($query->query['name'])
        && substr($wp->matched_rule, 0, 7) == "([^/]+)"
        && isset($query->query)
        && isset($wp->query_vars)
        && $query->query == $wp->query_vars)
    {
        if (!($post_types = get_query_var("post_type"))) {
            if ($wp_rewrite->permalink_structure == "/%postname%/")
                $post_types = array("post");
            else
                $post_types = array();
        }

        if (is_array($post_types)){ 
            $post_types[] = 'yemek';
            $post_types[] = 'page';
        }


        set_query_var("post_type", $post_types);
    } 
}

আপনার পোস্টের নামের সাথে 'ইয়ামেক' পরিবর্তন করুন।


0

এই লিঙ্কটি আপনার প্রশ্নের উত্তর দেওয়া উচিত:

http://ottopress.com/2011/how-the-postname-permalinks-in-wordpress-3-3-work/


না এটি তা করে না, এটি কেবল এসকিউএল এর ক্ষেত্রে এটি কীভাবে কাজ করে তা ব্যাখ্যা করে। তবে কাস্টম পোস্ট ধরণের কোনও উল্লেখ নেই, যা সমস্যা।
সিয়ানটিক

0

এর জন্য আমি সবচেয়ে পরিষ্কার উত্তরটি নিয়ে আসতে পারি (আমি কোনও প্লাগিন তৈরি করছি যা সত্যিকার অর্থে কোনও অগ্রণী স্লাগ ছাড়াই একটি কাস্টম পোস্ট ধরণের প্রয়োজন) কাস্টম পোস্ট ধরণের ব্যবহার না করে একটি কাস্টম পৃষ্ঠার টেম্পলেট ব্যবহার করা।

এটি করে, আপনার "কাস্টম পোস্ট টাইপ" তে পৃষ্ঠা বা পোস্ট পারমিলিক্সে পদক্ষেপ নেওয়ার চিন্তা না করেই / যেমন যাই হোক না কেন url থাকতে পারে।

এটি করার জন্য, আমি নিম্নলিখিতগুলি শেষ করেছি:

  • আমার প্লাগইনের ভিতরে একটি কাস্টম পৃষ্ঠার টেম্পলেট যুক্ত করা হচ্ছে
  • পৃষ্ঠা টেমপ্লেট সেট আপ করা হচ্ছে যাতে এটি পৃষ্ঠা সম্পাদকে নির্বাচন করা যায়
  • কাস্টম মেটা বাক্স তৈরি করা হচ্ছে যা কেবলমাত্র আমার পৃষ্ঠার টেমপ্লেটের জন্য প্রদর্শিত হবে

এটি আমাকে এতে অনুমতি দিয়েছে:

নিচের দিক

অবশ্যই, এটি পৃষ্ঠা বা পোস্ট লিঙ্কগুলিতে স্ট্যাম্প না থাকলেও এতে বেশ কয়েকটি স্পষ্ট ডাউনসাইড রয়েছে।

কোনও সংরক্ষণাগার আপনার কাছে কোনও সংরক্ষণাগার থাকবে না (যদি আপনি এটি চান) তবে এটি আপনার কাস্টম টেম্পলেটটি ব্যবহার করে সমস্ত পৃষ্ঠার সংরক্ষণাগার আঁকতে অন্য পৃষ্ঠার টেম্পলেট তৈরি করে সমাধান করা যেতে পারে।

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

পৃষ্ঠার তালিকায় একটি ফিল্টার যুক্ত করে (পৃষ্ঠার টেমপ্লেটটি ব্যবহার করা হচ্ছে আপনাকে ফিল্টার করতে দিতে), কোনও নতুন কলামে ব্যবহৃত কোনও পৃষ্ঠা টেম্পলেট প্রদর্শন করে এটি আংশিকভাবে সমাধান করা যেতে পারে etc.


বলা হচ্ছে, আমি এমন কিছু চেয়েছিলাম যা ব্যবহারকারীরা নতুন কাস্টম পৃষ্ঠা তৈরি করে কেন তা ভেবে বিস্মিত হবে না এবং দেখা গেছে যে তারা আর সাধারণ পৃষ্ঠাগুলিতে পৌঁছতে পারে না বা নতুন কাস্টম পৃষ্ঠায় তাদের সাইটে বিদ্যমান পৃষ্ঠাটি অদৃশ্য হয়ে যায়।

আমি জানি এটি আসল সমাধান নয়, তবে এটি এমন একটি বিকল্প যা আমার প্রয়োজনের জন্য দুর্দান্ত কাজ করেছে।

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