क्या पोस्ट प्रकाशित करने से पहले कस्टम फ़ील्ड को मान्य करने के लिए कोई कार्रवाई फ़िल्टर / हुक है?


11

मेरे पास एक रिवाज है जिसे बुलाया जाता है xxxx_urlxxxx_urlअद्वितीय होना चाहिए।

तो, पोस्ट प्रकाशित करने से पहले, मैं यह सुनिश्चित करना चाहता हूं कि xxxx_urlयह अद्वितीय है या नहीं? यदि यह अद्वितीय नहीं है, तो पोस्ट प्रकाशित करना अस्वीकार कर दिया जाना चाहिए।

मैंने कोशिश की publish_post। लेकिन यह सही नहीं है, क्योंकि जब हम पोस्ट प्रकाशित करते हैं तो यह ट्रिगर हो जाता है। मैं प्रकाशन से ठीक पहले अपना कोड चलाना चाहता हूं।


1
वर्तमान पोस्ट आईडी को अद्वितीय मान के रूप में सेट क्यों नहीं किया गया। जैसे: पोस्ट आईडी 132_urlकहां 132है। आपकी तुलना में यहाँ हमेशा एक अद्वितीय मूल्य है। इसके अलावा: कस्टम फ़ील्ड को save_postकार्रवाई में सहेजा जाना चाहिए । इस क्रिया में आप कस्टम फ़ील्ड की जाँच कर सकते हैं (यदि इसका खाली नहीं है और उदाहरण के लिए एक अद्वितीय मान है), और इसके आधार पर update_post_metaया नहीं। मुझे लगता है कि आप कस्टम फ़ील्ड को भी देख सकते हैं और यदि इसका कोई अनूठा मूल्य नहीं है, तो प्रकाशन को अक्षम करने के post-statusलिए draftया कुछ और सेट करें । अन्यथा मुझे लगता है कि आपको ऐसा करने के लिए jQuery की आवश्यकता है।
LWS-Mo

जवाबों:


5

की शुरुआत में wp_insert_post, जो फ़ंक्शन किसी पोस्ट को बचाता / अपडेट करता है, उसे एक फिल्टर कहा जाता है wp_insert_post_empty_content। डिफ़ॉल्ट रूप से यह फ़िल्टर जाँचता है कि क्या शीर्षक, संपादक और अंश फ़ील्ड सभी खाली हैं, इस स्थिति में सहेजने की प्रक्रिया रुकी रहेगी।

हालाँकि, चूंकि सभी फ़ील्ड को सहेजने के लिए इस फ़िल्टर को पास कर दिया गया है, आप इस फ़िल्टर का विस्तार करके यह निर्धारित करने के लिए कोई अन्य परीक्षण शामिल कर सकते हैं कि क्या पद रिक्त माना जाना चाहिए। यह कुछ इस तरह होगा:

add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {

  // extract custom field from $postarr, check uniqueness

  if ($unique) return false else return true;
  }

नोट: फ़ंक्शन को सहेजने की प्रक्रिया को रोकने के लिए 'सही' लौटना चाहिए।

यदि कस्टम फ़ील्ड अद्वितीय नहीं है, तो आप चेतावनी को प्रतिध्वनित करना चाहते हैं।


2
यह शायद काम करेगा, लेकिन एक समाधान होने की तुलना में हैक की तरह थोड़ा अधिक दिखता है। मैंने इस पर भी विचार किया है, लेकिन बाद में निर्णय नहीं लिया wp_insert_post_empty_contentक्योंकि खाली सामग्री के लिए शब्दार्थ का अर्थ है । यह कहने के बाद, मुझे ऐसा कोई भी हुक नहीं मिला जो इसके लिए या तो शब्दार्थ रूप से सही हो।
स्कॉट

ठीक है, अगर यह केवल खाली शीर्षक और सामग्री के लिए था तो डेवलपर्स के लिए फ़िल्टर नहीं होगा।
cjbj

1
यदि आप केवल 'खाली' शब्द पर कम ध्यान केंद्रित करते हैं, तो मैं कहूंगा कि यह फ़िल्टर यह जाँचने के लिए है कि क्या पद बचत के लिए न्यूनतम आवश्यकताओं को पूरा करता है। ओपी न्यूनतम आवश्यकताओं को व्यापक बनाना चाहता है। शायद यह wp_insert_post_valid_contentव्यक्त करने के लिए फ़िल्टर का नाम होना चाहिए , लेकिन बाकी के लिए यह बिल्कुल सही जगह पर है।
cjbj

@cjbj जब आपका इस तरह का सवाल है, तो आपको सही फ़िल्टर कैसे मिलेगा? मेरा मतलब है, आपको wp_insert_post_empty_contentफ़िल्टर कैसे मिला ?
मैं

1
ठीक है, जब आप कुछ समय के लिए WP के साथ काम कर रहे हैं, तो आपको पता है कि कोड का कौन सा भाग एडमिन के किस हिस्से को जनरेट करता है। तो आप फ़ाइल को देखें और उपलब्ध फ़िल्टर के लिए स्रोत कोड की जाँच करें।
cjbj

1

प्रकाशन के लिए पोस्ट सबमिट करने से पहले अद्वितीयता की जांच करने के लिए AJAX का उपयोग करने के बारे में कैसे?

$( '#post' ).on( 'submit', function( event ) {
  event.preventDefault(); // Prevent publishing

  //Now do some AJAX Checks
  $.post( ajaxurl, data, function(response) {
    if ( response === 'success' ) {
        $( this ).off( event ).submit();
    } else {
        alert( 'The custom field must be unique' );
    }
  });
});  

हालांकि कोड का परीक्षण नहीं किया गया है, लेकिन यह काम करना चाहिए। अपना वांछित परिणाम प्राप्त करने के लिए आपको इसके साथ खेलने की आवश्यकता हो सकती है।


0

मैं wp_insert_post_data फ़िल्टर में हुक लगाऊंगा और जितना संभव हो उतना कम घुसपैठ को संभालूंगा क्योंकि जैसा कि मैं समझता हूं कि आप किसी पोस्ट के सम्मिलन को अवरुद्ध नहीं करना चाहते हैं, आप केवल डुप्लिकेट मेटा मानों के साथ पोस्ट प्रकाशित करने से बचना चाहते हैं।

मैं इस मामले में बहुत अधिक नहीं छोड़ सकता क्योंकि आपने कोई कोड साझा नहीं किया था, लेकिन यहां एक फिल्टर का कुछ छद्म कोड है जो काम करेगा:

function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
    // setup an uniqueness flag.
    $meta_is_unique = true;

    // check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
    // {...} <- your code

    // if the meta is NOT unique keep the post status in draft.
    if ( ! $meta_is_unique ) {
        // you can force the current post to be draft until the meta value will became unique.
        $data['post_status'] = 'draft';
        // maybe, update the meta value with a hint of the fact that it's not unique.
        // or display a dashboard notice about it.
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );

इस फिल्टर के बारे में एक और बड़ी बात यह है कि यह एक संलग्नक से अलग है wp_insert_attachment_data

मुझे आशा है कि यह मदद करता है, और आप जो भी करते हैं, वह भयानक लगता है!


2
यह एक अच्छा विचार नहीं हो सकता है। यदि $data['post_status']है publishऔर उपयोगकर्ता इसे अपडेट कर रहा है तो क्या होगा? पोस्ट बनाने के रूप में उस पोस्ट के draftलिए एक 404मुद्दा नहीं होगा ?
स्कॉट

@ शब्द को दूसरे शब्दों में, यदि कोई प्रकाशित पोस्ट सेव पर पता लगाता है कि उसका मेटा मान अद्वितीय नहीं है, तो पोस्ट प्रकाशन को अस्वीकार कर दिया जाना चाहिए, और पोस्ट का मसौदा तैयार किया जाना चाहिए। फिर से, मुझे नहीं पता कि मेटा मूल्य कितना महत्वपूर्ण है, लेकिन अगर यह एक छंटनी डेटा प्रकार या कुछ आवश्यक है, तो पोस्ट की स्थिति का मसौदा तैयार किया जाना चाहिए (जिसका मतलब 404 मुद्दा नहीं है, यह सिर्फ कहता है कि पोस्ट किया गया है जनता के दृष्टिकोण से सेवानिवृत्त)
आंद्रेई

-1

चेक को जाना चाहिए wp_insert_post। जब भी पोस्ट प्रकाशित या संपादित की जाती है तो इस हुक को निकाल दिया जाता है।

वहां, आप यह जांचने के लिए एक कस्टम क्वेरी कर सकते हैं कि क्या कोई पोस्ट पहले से ही समान है xxxx_urlया नहीं।

add_action('wp_insert_post', function($post_id) {
    $meta_key = 'xxxx_url';
    $meta_value = get_post_meta($post_id, $meta_key, true);
    $query = new WP_Query([
        'post_type' => get_post_type($post_id),     // This might be unnecessary, if you check `post` post type only. Or use `any`.
        'meta_query' => [
            [
                'meta_key' => $meta_key,
                'meta_value' => $meta_value,
            ]
        ]
    ]);
    if ($query->have_posts()) {
        // invalid key, post with the same value already exists
    } else {
        // valid, key was not found anywhere
    }
});

3
जैसा कि मुझे पता है, अगर आप / अगर स्टेटमेंट पोस्ट के अंदर जो कुछ भी लिखते हैं वह प्रकाशित हो जाएगा क्योंकि wp_insert_postपोस्ट को एक बार सहेजने के बाद एक्शन फायर हो जाता है, तो यह पब्लिशिंग या पोस्ट डालने को ब्लॉक नहीं कर सकता है।
मैं

तो आप प्रकाशन को अवरुद्ध करना चाहते हैं, अगर पोस्ट सत्यापन विफल रहता है? आपने havent 'लिखा है कि आपके प्रश्न में।
पेट्र सिबुल्का

मैंने If it isn't unique it should reject publishing post.अपने प्रश्न में स्पष्ट रूप से उल्लेख किया है ।
मैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.