मैं switch_to_blog () पर कैसे भरोसा कर सकता हूं?


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?
JMau

@JMau get_post()सिर्फ एक पढ़ा है। अंतिम सहेजें और अगले संपादित स्क्रीन पुनः लोड के बीच एक लंबा विराम हो सकता है।
FUXIA

5
Wp_blogs तालिका में ब्लॉग_id के लिए प्रति-अनुरोधित कैश क्वेरी (जहाँ हटाए गए = 0)?
gmazzap

1
@GMSELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
kaiser

@toscho जोर से सोच रहा है ... वहाँ है wp_cache_switch_to_blog(), लेकिन यह केवल पृष्ठ कैश पर डिफ़ॉल्ट रूप से मदद करता है, पृष्ठ WP चीज़ पर डिफ़ॉल्ट नहीं। वैसे भी, मेरे लिए यह वास्तव में स्पष्ट नहीं है कि आप ब्लॉग के अस्तित्व की जाँच कहाँ करना चाहते हैं: जब कोई व्यक्ति किसी ब्लॉग को हटाता है या जब कोई अनुवादित पोस्ट लिखने की कोशिश करता है जो एक अलग ब्लॉग को इंगित करता है (उसी सामग्री को किसी अन्य भाषा में पावर करना)?
कैसर

जवाबों:


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, और मुझे लगता है कि इसी तरह की कोर switch_to_blog में होना चाहिए कुछ ...
gmazzap

@GM get_var()सिर्फ एक परिणाम देता है। मैंने अब उपयोग किया get_col()है, और मैंने यह सुनिश्चित किया है कि एक खाली परिणाम फिर से नहीं लाया जाता है।
FUXIA

आह ठीक है ... मैंने बेहतर तरीके से अब क्वेरी पढ़ी है, आपको एक विशिष्ट साइट आईडी के लिए सभी ब्लॉग आईडी मिलते हैं, पहली बार में मैंने पढ़ा है कि आप समय पर केवल एक ब्लॉग आईडी प्राप्त करते हैं (एक कार्य करने के लिए पारित) ... निश्चित रूप से सरणी रास्ता बेहतर है। मैं माफी चाहता हूँ संभव नहीं +1 फिर से है :)
gmazzap
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.