কীভাবে সেভ_পোস্ট কলব্যাকে অসীম লুপটি এড়ানো যায়


12

আমি আমার সমস্যাগুলি সমাধান করার জন্য এই সাইটটি প্রচুর ব্যবহার করছি, তবে এবার আমি আমার সমস্যার সন্ধান এবং উত্তর দিতে সফল হই নি।

wp_update_postযে ফাংশনটি ডাকা হয় তার ভিতরে ব্যবহার করার সময় আমি পাই এবং অসীম লুপ পাই save_post। আমি জানি যে এটি একটি সাধারণ সমস্যা, তবে কীভাবে এড়ানো যায় তা আমি বুঝতে পারি না।

আমি আমার পোস্টগুলির ক্রমটি সংরক্ষণ করতে চাই (যা পোস্ট-টাইপ 'বিভাগ' এর)। সুতরাং আমি একটি কাস্টম মেটা বক্স তৈরি করেছি যাতে কিছু বাছাইযোগ্য এইচটিএমএল-উপাদান রয়েছে। প্রতিটি উপাদানগুলিতে = 'বিভাগীয় [[]' নাম সহ একটি লুকানো ইনপুট ট্যাগ রয়েছে। সুতরাং আমি যখন স্ট্যান্ডার্ড ওয়ার্ডপ্রেস 'আপডেট' বোতামটি ক্লিক করি তখন পোস্টগুলির সমস্ত আইডির সমন্বিত একটি অ্যারে POST এর মাধ্যমে প্রেরণ করা হয়। সুতরাং এখানে কোডটি আমি অ্যারেটি পুনরুদ্ধার করেছি এবং আদেশটি সংরক্ষণ করতে চাইছি:

    // Update section sort order
$sectionorder = $_POST['sectionorder'];
if (isset($sectionorder)) { // Avoid error if there is no sections added yet
    foreach( $sectionorder as $no => $sectionID ) {
        $post_update = array();
        $post_update['ID'] = $sectionID;
        $post_update['menu_order'] = $no;
        wp_update_post( $post_update );
    }
}

তবে সমস্যাটি এটি একটি অসীম লুপ শুরু করে starts আমি কীভাবে এড়াতে পারি? সম্ভবত আমি এটি সম্পূর্ণ ভিন্ন উপায়ে করতে পারি?

আপনার সহায়তা কৃতজ্ঞ!

উত্তর:


26

আপনি save_postহুক থেকে কলব্যাক সরিয়ে ফেলতে পারেন , পোস্টটি আপডেট করতে পারেন এবং তারপরে কলটি পুনরায় হুকটিতে যুক্ত করতে পারেন । কোডেক্স একটি উদাহরণ দেয়

add_action('save_post', 'wpse51363_save_post');

function wpse51363_save_post($post_id) {

    //Check it's not an auto save routine
     if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
          return;

    //Perform permission checks! For example:
    if ( !current_user_can('edit_post', $post_id) ) 
          return;

    //Check your nonce!

    //If calling wp_update_post, unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'wpse51363_save_post');

    // call wp_update_post update, which calls save_post again. E.g:
    wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));

    // re-hook this function
    add_action('save_post', 'wpse51363_save_post');
}

কি দারুন. দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ. একটি যাদুমন্ত্র মত কাজ করে! কেন জানি না যে আমি নিজেই কোড কোডটি দেখতে পেলাম না
এলজেহেল

@ স্টেফেন, আমি update_post_metaএমন কোনও ফাংশন ব্যবহার save_postকরি যা আমিও খুলে ফেলা এবং পুনরায় গুছানো উচিত update_post_meta?
আনাজিও

না, update_post_meta(সাধারণত) save_postট্রিগার হওয়ার কারণ হবে না ।
স্টিফেন হ্যারিস

এক ঘন্টা নষ্ট করার পরে এটি পাওয়া গেল এবং এতে আরও কয়েক ঘন্টা সাশ্রয় হয়েছে, ধন্যবাদ।
মনছুমাহার

13

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

অ্যাকশন যুক্ত করার সময় আপনি যদি অগ্রাধিকার সেট করেন তবে আপনি যখন সরিয়ে ফেলবেন তখন অগ্রাধিকার নির্দিষ্ট না করে আপনি এখনও একটি অসীম লুপ পাবেন।

add_action('save_post', 'wpse51363_save_post', 25 );

// এটি পরিচালনা করার জন্য ভুল উপায় - অসীম লুপের দিকে পরিচালিত করে

remove_action('save_post', 'wpse51363_save_post');
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post');

// এটি হ্যান্ডেল করার সঠিক উপায় - কেবল একবার কার্যকর করা হয়

remove_action('save_post', 'wpse51363_save_post', 25 );
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post', 25 );

1
ওহ ধন্যবাদ! আমি এখনও যুক্ত করার পরেও কেন আমি অনন্ত লুপ পাচ্ছিলাম তা জানার চেষ্টা করে বাদাম যাচ্ছিলাম remove_action/add_action
বান্জার

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

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