শুধুমাত্র একটি নির্দিষ্ট কাস্টম পোস্ট ধরণের জন্য কীভাবে আমি মেটাডেটা সংরক্ষণ করব?


16

আমি এই টিউটোরিয়াল অনুসরণ করে একটি কাস্টম পোস্ট টাইপ সেট আপ করার চেষ্টা করছি । তবে, কীভাবে / কোথায় প্রয়োগ করব তা নিয়ে আমি কিছুটা বিভ্রান্ত update_post_meta()। টিউটোরিয়ালটি এই প্যাটার্নটির পরামর্শ দেয়:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

যা কাজ করে, তবে এই মেটাডেটা প্রতিটি পোস্টে যুক্ত করার দুর্ভাগ্যজনক প্রভাব রয়েছে, এটি এই কাস্টম টাইপেরই হোক না কেন।

আমি উপরেরটি রেখেছি functions.phpএবং অনুমান করছি যে এটি সমস্যার অংশ হতে পারে। আমি অনুমান করছি যে আমার 'কাস্টম টাইপ' পোস্টের জন্য কেবল 'সেভ_পোস্ট' ক্রিয়াটি সীমাবদ্ধ করতে হবে।


দুর্দান্ত প্রশ্ন ববি জ্যাক তবে আমি আপনাকে "নির্দিষ্ট কাস্টম পোস্টের ধরণের জন্য কেবলমাত্র মেটাডেটা কীভাবে সংরক্ষণ করতে পারি" এর মতো কিছুতে প্রশ্নটি পুনঃবিবেচিত করতে বলতে পারি; আপনার শিরোনামটি যখন তারা এই সমস্যার সমাধানের সন্ধান করছেন তখন লোকেরা তাদের স্বীকৃতি দিতে পারে না।
মাইকস্কিঙ্কেল

@ মাইক: সম্পন্ন (আপনার পরামর্শের সাথে সম্পূর্ণ সম্মত, ধন্যবাদ!)
ববি জ্যাক

উত্তর:


18
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

এটা কাজ করা উচিত। পোস্ট টাইপের নামের সাথে কেবল 'your_post_type' প্রতিস্থাপন করুন। এছাড়াও, সামান্য পরিচিত তথ্য: 'সেভ_পোস্ট' হুক একটি তর্ক হিসাবে পোস্টের আইডি পাস করে।

সম্পাদনা

আমি জানার মন্তব্য প্রতিফলিত করতে ফাংশন আপডেট করেছি। ধন্যবাদ জান!


1
এমনকি পোস্টটি নিজেই দ্বিতীয় যুক্তি হিসাবে যুক্ত হয় , তাই আপনাকে বৈশ্বিক চলক ব্যবহার করার দরকার নেই।
জান ফ্যাব্রি

এই সমাধানটি কাজ করে ... আমি অনেক সাফল্যের সাথে ক্লায়েন্ট প্রকল্পগুলিতে এটি ব্যবহার করেছি।
EAMAN

উজ্জ্বল- একটি কবজির মতো কাজ করে। এবং আমি ধরে নিচ্ছি যে "($ post-> post_type == 'প্রাণী') {আপডেট_পোস্ট_মেটা ($ আইডি," সংখ্যা_মুখে_সমাধিগুলি ", $ _POST ['নাম্বার_অর্থ_লীগস]] করতে" তা বুদ্ধিমান হবে would অন্যথায় যদি ($ পোস্ট-> পোস্ট_ টাইপ == 'যানবাহন') {আপডেট_পোস্ট_মেটা ($ আইডি, "নাম্বার_ও_ওয়েলস", $ _POST ['নাম্বার_ও_ওয়েলস]]);} // ... ইত্যাদি ... বিভিন্ন পোস্টের বিভিন্ন ধরণের পরিচালনা করতে? মন্তব্যের দুর্বল বিন্যাসের ক্ষমতা!)
ববি জ্যাক

আসলে, একাধিক পোস্ট-প্রকারের সাথে আমি পরিবর্তে একটি স্যুইচ স্টেটমেন্ট ব্যবহার করার পরামর্শ দেব। কম মার্কআপ, দ্রুত কার্য সম্পাদন, ভবিষ্যতে কেস যুক্ত করা সহজ।
EAMAN

@ এ্যামান - হ্যাঁ, লেখার মধ্য দিয়ে আমি বুঝতে পেরেছিলাম যে একটি স্যুইচ আরও ভাল হবে, তবে মন্তব্যগুলি সম্পাদনা কোড শুরু করার আদর্শ জায়গা নয়, তাই আমি অলসতা পেয়েছি;)
ববি জ্যাক

4

আপনি যদি একাধিক পোস্টের প্রকারগুলি পরিচালনা করতে চান তবে আমি একটি মৌলিক সুইচ বিবৃতিটি সুপারিশ করব:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

কেসগুলি মূলত একই রকম if($post->post_type) == 'post_type_1') {}তবে একাধিক যদি-অন্য ব্লকের প্রয়োজন হয় না। defaultস্যুইচটিতে থাকা ব্লক এমন মামলাগুলি পরিচালনা করে যেখানে পোস্টের ধরণটি আপনার কাস্টম সেটে নেই।


4

@ জন পি ব্লচ এবং @ এমএএনএএন ইতিমধ্যে দুর্দান্ত উত্তর দিয়েছেন যাতে আমার অতিরিক্তটিও রয়েছে:

  1. আন্ডারস্কোর দিয়ে আপনার মেটা_কিগুলি উপসর্গ বিবেচনা করুন । এটি সম্পাদন করার পরে কোনও পোস্ট সম্পাদনা স্ক্রিনে প্রদর্শিত কাস্টম ক্ষেত্রগুলির তালিকা থেকে এগুলি লুকায়

    ফাংশন save_my_metadata ($ পোস্ট_আইডি, $ পোস্ট = মিথ্যা) {
       যদি ($ পোষ্ট-> post_type == 'your_post_type')
          আপডেট_পোস্ট_মেটা ($ পোস্ট_আইডি, '_ মাই_মেডাটাটা', $ _POST ['মাই_মেটাডেটা']);
    }
    
    স্পষ্টতই এর অর্থ হ'ল ক্ষেত্রগুলি সম্পাদনা করতে সক্ষম হওয়ার জন্য আপনার একটি কাস্টম মেটাবক্স প্রয়োজন need এখানে প্রসঙ্গে একটি সম্পাদনা পর্দা দেওয়া হয়েছে:



  2. আর একটি জিনিস যা আপনি করতে পারেন তা হ'ল নির্দিষ্ট পোষ্টের সংরক্ষণগুলি সহজ করার জন্য আপনার নিজের হুক যুক্ত করুন, অর্থাত আপনার হুক হতে পারে " save_{$post_type}_post"; একটি movieপোস্ট টাইপ জন্য এটি হবে save_movie_post। আপনার থিমের functions.phpফাইল বা কোথাও একটি প্লাগইনে আপনাকে যা যুক্ত করতে চান তা এখানে :

    যোগ_অ্যাকশন ('save_post', 'save_custom_post_type_posts', 10,2);
    ফাংশন save_custom_post_type_posts ($ পোস্ট_আইডি, $ পোস্ট = মিথ্যা) {
       do_action ( "সংরক্ষণ: _ {$ পোষ্ট-> post_type} _POST");
    }
    
    এটির সাহায্যে আপনি নিজের মূল কোডটি আবার লিখতে পারেন (উপরের # 1 থেকে আন্ডারস্কোর ট্রিক সহ):

    ADD_ACTION ( 'save_my_postype_post', 'save_my_postype_metadata', 10,2);
    ফাংশন save_my_postype_metadata ($ পোস্ট_আইডি, $ পোস্ট)
        আপডেট_পোস্ট_মেটা ($ পোস্ট_আইডি, '_ মাই_মেডাটাটা', $ _POST ['মাই_মেটাডেটা']);
    }

1

ব্যক্তিগতভাবে, আমি পোস্টের ধরণে কাস্টম মেটা হ্যান্ডলার যুক্ত করার জন্য নীচের ধরণটি অনুসরণ করতে পছন্দ করি। নীচের সাথে, আপনি কেবল পোস্ট টাইপের মেটা সমর্থন যুক্ত করতে পারেন কেবল সমর্থন টাই (নীচের উদাহরণে 'সাবটাইটেল') যোগ_পোস্ট_টাইপ_সুপুর্ট ('আমার_পোস্ট_টাইপ', 'সাবটাইটেল') কল করে পোস্ট টাইপের সমর্থন অ্যারেতে;

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

আশা করি শিগগিরই এরকম কিছু মূল রূপে যুক্ত হবে।


0

পূর্ববর্তী আপডেট করার পরে বর্তমান পোস্টটি আপনার পোস্ট-টাইপের কিনা তা পরীক্ষা করে দেখুন। এটি নিশ্চিত করবে যে আপনি এটি সমস্ত পোস্টের জন্য সংরক্ষণ করবেন না।

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

একটি পোস্টের প্রকার পাওয়া: get_post_type()বা$post->post_type;


0

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

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');

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