আমি কীভাবে সুইচ_ট_ব্লগকে বিশ্বাস করতে পারি ()?


18

আমি যখন switch_to_blog()কোনও ব্লগ আইডি দিয়ে কল করি তখন আমি জানি না যে সেই ব্লগটি আসলে রয়েছে কিনা। ফাংশন সর্বদা ফিরে আসে TRUE

পরীক্ষা ক্ষেত্রে:

switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();

এটি ব্যবহারকারীর সামনে থাকা ডাটাবেস ত্রুটিগুলির ফলস্বরূপ। আমি কীভাবে এটি প্রতিরোধ করতে পারি?

রিয়েল ওয়ার্ল্ড ইউজ কেস

আমি বহুভাষিক প্রেসের প্রধান বিকাশকারী ছিলাম । যখন কোনও ব্যবহারকারী কোনও পোস্ট অনুবাদ করে, তখন সে এর মতো একটি স্ক্রিন পায়:

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

এখন নিম্নলিখিতটি ঘটতে পারে:

  1. তিনি পোস্টটি সাফল্যের সাথে সংরক্ষণ করেন এবং পোস্টটির অনুবাদ করা চালিয়ে যান।
  2. আরেকজন ব্যবহারকারী, একটি নেটওয়ার্ক অ্যাডমিন, জার্মান ব্লগটি লেখার সময় মুছে ফেলেন।
  3. সে আবার সেভ হিট করে এবং ডাটাবেস ত্রুটি পায়।

আমি সেই দৃশ্য এড়াতে চাই টার্গেট ব্লগ উপস্থিত থাকলে আমি কীভাবে দ্রুত পরীক্ষা করতে পারি ? আমি switch_to_blog()প্রায়শই একাধিক বিভিন্ন ক্লাসে কল করি , তাই এটি দ্রুত হতে হবে।


কিভাবে $wpdb->blogid;এবং হুক wp_insert_post_data?
জেমাউ

@ জেমাউ get_post()কেবল পঠনযোগ্য। শেষ সংরক্ষণ এবং পরবর্তী সম্পাদনা স্ক্রিন পুনরায় লোডের মধ্যে একটি দীর্ঘ বিরতি থাকতে পারে।
ফুসিয়া

5
ডাব্লুপি_ব্লগস সারণীতে ব্লগ_আইডির জন্য প্রতি-অনুরোধের ক্যাশেড এসকিউএল কোয়েরি (যেখানে = 0 মুছে ফেলা হয়েছে)?
গাজাজ্যাপ

1
@ জিএমSELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
কায়সার

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

উত্তর:


10

@ জিএম-এর চেকটি ক্যাশে করার ধারণা আমাকে নীচের সহায়ক ফাংশনে নিয়ে গেছে। আমি এটি সর্বত্র উপলব্ধ করার জন্য এটি বিশ্বব্যাপী নেমস্পেসে রেখেছি।

ফাংশনটি ব্লগের স্থিতি সম্পর্কে কিছু বলবে না, যদি এটি উপস্থিত থাকে এবং মুছে ফেলা হিসাবে চিহ্নিত না হয়। ডাটাবেস ক্যোয়ারীটি খুব দ্রুত (0.0001 সেকেন্ড) এবং সাইট আইডিতে কেবল একটি ক্যোরি চালায়, যতক্ষণ ফাংশন বলা হোক না কেন।

if ( ! function_exists( 'blog_exists' ) ) {

    /**
     * Checks if a blog exists and is not marked as deleted.
     *
     * @link   http://wordpress.stackexchange.com/q/138300/73
     * @param  int $blog_id
     * @param  int $site_id
     * @return bool
     */
    function blog_exists( $blog_id, $site_id = 0 ) {

        global $wpdb;
        static $cache = array ();

        $site_id = (int) $site_id;

        if ( 0 === $site_id )
            $site_id = get_current_site()->id;

        if ( empty ( $cache ) or empty ( $cache[ $site_id ] ) ) {

            if ( wp_is_large_network() ) // we do not test large sites.
                return TRUE;

            $query = "SELECT `blog_id` FROM $wpdb->blogs
                    WHERE site_id = $site_id AND deleted = 0";

            $result = $wpdb->get_col( $query );

            // Make sure the array is always filled with something.
            if ( empty ( $result ) )
                $cache[ $site_id ] = array ( 'do not check again' );
            else
                $cache[ $site_id ] = $result;
        }

        return in_array( $blog_id, $cache[ $site_id ] );
    }
}

ব্যবহার

if ( ! blog_exists( $blog_id ) )
    return new WP_Error( '410', "The blog with the id $blog_id has vanished." );

কেন $wpdb->get_results+ wp_list_pluckকেবল পরিবর্তে (int) $wpdb->get_var? তবে +1, এবং আমি মনে করি যে অনুরূপ
কিছুটি

@ জিএম get_var()কেবল একটি ফলাফল ফেরত দেয়। আমি এখন ব্যবহার করেছি get_col()এবং আমি নিশ্চিত করেছি যে খালি ফলাফল আর এনেছে না।
ফুসিয়া

আহ ঠিক আছে ... আমি এখনই কোয়েরিটি আরও ভালভাবে পড়ি, আপনি নির্দিষ্ট সাইটের আইডির জন্য সমস্ত ব্লগ আইডি পেয়ে যান, প্রথমে আমি পড়ি আপনি সময়মতো মাত্র একটি ব্লগ আইডি পেয়ে যাবেন (যেটি ফাংশনে পাস করেছেন) ... নিশ্চিত অ্যারে উপায় ভাল। আমি দুঃখিত, আবার +1 সম্ভব নয় :)
gmaszap
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.