WordPress द्वारा डेटाबेस में 'post_content_filtered' कॉलम कब साफ किया जाता है?


29

कुछ वर्डप्रेस प्लगइन्स (हालांकि बहुत कम) post_content_filteredपोस्ट से संबंधित कुछ डेटा को बचाने के लिए डेटाबेस में कॉलम का उपयोग करते हैं ।

उदाहरण के लिए, सहेजें पर मार्कडाउन post_content_formattedकॉलम में अलग से पोस्ट के मार्कडाउन संस्करण और कॉलम में पार्स post_contentकिए गए HTML को संग्रहीत करता है, ताकि जब प्लगइन निष्क्रिय हो जाए तो पोस्ट मार्कडाउन से बाहर नहीं निकलेंगे (क्योंकि HTML में संग्रहीत है post_content)।

अब, मुझे एहसास हुआ कि post_content_filteredअस्थायी भंडारण के लिए बहुत अधिक उपयोग किया जाता है अर्थात जब कॉलम में सामग्री खो जाती है (या साफ़ हो जाती है):

  • आप 'त्वरित संपादन' विकल्प का उपयोग करके किसी पोस्ट (शीर्षक, टैग, श्रेणियां आदि) में परिवर्तन करते हैं

  • एक अनुसूचित पोस्ट (स्वचालित रूप से) प्रकाशित है

  • आप पदों के लिए थोक संपादन करते हैं

  • आप किसी पोस्ट के संशोधन के बीच स्विच करते हैं

  • किसी पोस्ट को बाहरी संपादक से बचाया जाता है (अर्थात वर्डप्रेस पोस्ट संपादक नहीं)

प्रशन:

  1. post_content_filteredकॉलम में डेटा किन अन्य स्थितियों में साफ़ किया गया है?

  2. क्या इसे रोकने का कोई तरीका है? (मेरा मतलब है, क्या यह सुनिश्चित करने का एक तरीका है कि डेटा स्थायी रूप से संग्रहीत किया जाता है, जिस तरह से post_contentस्तंभ का इलाज किया जाता है?)

जवाबों:


29

वर्डप्रेस में प्रत्येक पोस्ट अपडेट wp_update_postफ़ंक्शन द्वारा नियंत्रित किया जाता है ।

इस फ़ंक्शन में कुछ चूक हैं, और post_content_filteredडिफ़ॉल्ट मान के लिए '' (खाली स्ट्रिंग) है।

एक बार चूक को कार्य करने के लिए पास किए गए आर्ग्स के साथ विलय कर दिया जाता wp_parse_argsहै, इसका मतलब है कि हर बार जब कोई पोस्ट अपडेट किया जाता है और post_content_filteredस्पष्ट रूप से पारित नहीं होता है, तो यह एक खाली स्ट्रिंग पर सेट होता है।

अब हम पूछ सकते हैं: post_content_filteredस्पष्ट रूप से कब पारित किया जाता है wp_update_post? उत्तर है: वर्डप्रेस द्वारा कभी नहीं

तो आपके पहले प्रश्न के लिए:

किन अन्य स्थितियों में पोस्ट_ कॉन्टेंट_फिल्ड कॉलम में डेटा साफ़ किया गया है?

संक्षिप्त उत्तर है: हर बार किसी भी कारण से कोई पोस्ट अपडेट की जाती है

ध्यान दें कि केवल एक ही क्षेत्र से बदल रहा है एक अद्यतन, विशेष रूप से, हर स्थिति में बदलाव को एक अद्यतन, जैसे मसौदा प्रकाशित करने के लिए, प्रकाशित करने, प्रकाशित करने, कचरा पर प्रकाशित (एक टिप्पणी को हटाना) भविष्य लंबित, और इतने पर है ...

यदि किसी पोस्ट में कुछ परिवर्तन होता है, तो post_content_filteredउसे मंजूरी दे दी जाती है; केवल अपवाद जब post_content_filteredस्पष्ट रूप से पारित किया जाता है wp_update_post, और जैसा कि पहले ही कहा गया है, यह वर्डप्रेस द्वारा कभी नहीं किया जाता है।

क्या इसे रोकने का कोई तरीका है? (मेरा मतलब है, क्या यह सुनिश्चित करने का एक तरीका है कि डेटा स्थायी रूप से संग्रहीत हो?

यदि आप अपने कोड के साथ उस फ़ील्ड को बनाते हैं, और आप इसे संरक्षित करना चाहते हैं, तो आपको वर्डप्रेस द्वारा किए गए हर अपडेट को देखना होगा , और परिवर्तन को रोकना होगा।

यह कठिन परिश्रम की तरह लग सकता है, लेकिन यदि आप इस उत्तर में पहला वाक्य पढ़ते हैं, " वर्डप्रेस में प्रत्येक पोस्ट अपडेट wp_update_postफ़ंक्शन द्वारा नियंत्रित किया जाता है ", तो आप समझते हैं कि उस फ़ंक्शन को देखने के लिए केवल एक चीज की जरूरत है, जिसमें सौभाग्य से अलग-अलग हुक हैं ।

हुक जो मैं सुझाता हूं वह wp_insert_post_data2 कारणों से है:

  • यह चलाता है से पहले अद्यतन है, तो आप की जरूरत नहीं है ठीक हो , लेकिन आप कर सकते हैं रोकने के
  • यह 2 मापदंडों को पारित करता है: जिस डेटा को फ़ंक्शन अपडेट करने जा रहा है, और पारित मापदंडों की एक सरणी, (अपडेट के मामले में) में पोस्ट की आईडी होती है

तो एक साधारण का उपयोग करके get_postआप तुलना कर सकते हैं कि पोस्ट अब कैसे है, और पोस्ट कैसा होगा: यदि आपको कुछ पसंद नहीं है, तो आप इसे बदल सकते हैं।

चलो कोड:

add_filter( 'wp_insert_post_data', 'preserve_content_filtered', 999, 2 );

function preserve_content_filtered ( $data, $postarr ) {

    /* If this is not an update, we have nothing to do */
    if ( ! isset($postarr['ID']) || ! $postarr['ID'] ) return $data;

    /*
     * Do you want you filter per post_type?
     * You should, to prevent issues on post type like menu items.
     */
    if ( ! in_array( $data['post_type'], array( 'post', 'page' ) ) ) return $data;

    /* How post is now, before the update */
    $before = get_post( $postarr['ID'] ); 

    /* If content_filtered is already empty we have nothing to preserve */
    if ( empty( $before->post_content_filtered ) ) return $data;

    if ( empty( $data['post_content_filtered'] ) ) {
        /*
         * Hey! WordPress wants to clear our valuable post_content_filtered...
         * Let's prevent it!
         */
        $data['post_content_filtered'] = $before->post_content_filtered;
    }

    return $data;

}

एक संभावित मुद्दा है, जहां पिछला फ़ंक्शन हर post_content_filtered सफाई को रोकता है । और यदि आप किसी भी कारण से इसे खाली करना चाहते हैं?

मैंने कहा है कि हर WP पोस्ट में परिवर्तन होता है wp_update_post, लेकिन आप वर्डप्रेस नहीं हैं।

आप एक फ़ंक्शन लिख सकते हैं जैसे:

function reset_post_content_filtered( $postid ) {
    global $wpdb;
    $wpdb->query( $wpdb->prepare(
        "UPDATE $wpdb->posts SET `post_content_filtered` = '' WHERE `ID` = %d", $postid
    ) );
}

$wpdbक्वेरी होने के नाते , यह हमारे फ़िल्टर को ट्रिगर नहीं करता है, इसलिए रीसेट करना बिना किसी समस्या के किया जाता है, और आपके कोड में हर जगह आपको रीसेट करने की आवश्यकता होती है post_content_filtered, आप इस फ़ंक्शन को कॉल कर सकते हैं।

आप एक बटन 'क्लियर कंटेंट फिल्टर्ड' बटन के साथ एक मेटाबॉक्‍स भी बना सकते हैं और जब इस बटन को क्लिक किया जाता है तो अपने reset_post_content_filteredकार्य को कॉल करें , जैसे अजाक्स।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.