मैं कस्टम प्लगइन पृष्ठ क्रियाओं को सर्वोत्तम तरीके से कैसे संभालूं?


21

मैं लगातार उसी झुंझलाहट में भाग रहा हूं, इसलिए मैंने सोचा कि मैं देखूं कि क्या कोई विचार है या वहां कोई अनुभव है ...

मैंने एक प्लगइन बनाया है जो स्वयं के व्यवस्थापक पृष्ठ का उपयोग करता है। यह होना चाहिए। अब जब मैंने WP_List_Table () सामग्री को सॉर्ट किया, तो मुझे कहना होगा कि यह बहुत अच्छा है ... लेकिन ...।

कस्टम प्लगइन पेज हमेशा admin.php?page=...तब तक लोड होते हैं जब तक मैं उन्हें सीधे प्लगइन निर्देशिका से लोड नहीं करना चाहता, जो मैं नहीं करता। अब अगर मैं उस पेज से 'एक्शन' करता हूं, तो मुझे उस प्रक्रिया को प्रोसेस करने की जरूरत है और फिर एक्शन पैरामीटर के बिना पेज पर वापस भेज देंगे। कोई फर्क नहीं पड़ता कि मैं एक GET या POST करता हूं, वास्तव में।

सभी आंतरिक पृष्ठों पर WP एक ही पृष्ठ पर ऐसा करता है, यह जाँचता है कि क्या कोई कार्यवाही है, यदि कोई प्रक्रिया करता है और फिर कार्रवाई के बिना खुद को रीडायरेक्ट करता है। यह संभव है, क्योंकि इन पृष्ठों पर admin-headerअभी तक लोड नहीं किया गया है।

यदि आप इसे अपने पेज पर करने का प्रयास करते हैं, हालांकि, आधा व्यवस्थापक इंटरफ़ेस पहले ही ब्राउज़र को भेज दिया गया है, इसलिए अब कोई रीडायरेक्ट संभव नहीं है। स्पष्ट रूप से, समाधान POST / GET से सीधे दूसरे पृष्ठ पर है, उस पर WP फ्रेमवर्क लोड करें, प्रसंस्करण करें और फिर मूल पृष्ठ पर वापस अनुप्रेषित करें ... लेकिन ... यह थोड़ा कष्टप्रद है, क्योंकि ... मेरा मूल पृष्ठ को कॉलबैक के माध्यम से लोड किया जाता है, इसलिए यह मेरी कक्षा की एक विधि के भीतर चलता है। वह सुंदर है।

यदि मैं एक अलग पृष्ठ लोड करता हूं, तो मुझे wp-load.phpअपनी कक्षा के बाहर मैन्युअल रूप से शामिल करना होगा , जो कष्टप्रद है, और मेरे विशेष मामले में मुझे विशेष रूप से परेशान करता है, क्योंकि मैं केवल अपने प्लगइन वर्ग को गुमनाम रूप से प्रेरित कर रहा हूं ताकि कोई भी इसे एक्सेस न कर सके बाहर से।

तो यह लंबे समय से कहानी के बाद ... किसी को भी एक कॉलबैक के माध्यम से एक और पेज लोड करने के लिए एक अच्छा समाधान के साथ आने की थी बिना पूरे व्यवस्थापन इंटरफ़ेस पहले से ही इसके चारों ओर सेटअप हो रही है?

(मुझे एक वर्कअराउंड का पता है ... मैं एक फ़ंक्शन को load-....कार्रवाई पैरामीटर के लिए उस चेक में हुक कर सकता हूं और प्रसंस्करण और रीडायरेक्ट करता हूं। लेकिन मैं सोच रहा हूं कि क्या कोई बेहतर तरीका है।)

धन्यवाद।


इसे क्यों टैग किया गया है [plugin-wp-pagenavi]? [plugin-development]यहाँ निश्चित रूप से स्वागत है।
Jan Fabry

@Jan Fabry: यकीन नहीं है कि क्या plugin-wp-pagenaviहै ... मैं मान रहा था कि यह प्लगइन्स और व्यवस्थापक मेनू के बीच संबंध से संबंधित चीजों के लिए था। चूंकि मेरा सवाल उसी से संबंधित है, इसलिए मैंने उस टैग को चुना।
wyrfel

WP-PageNavi फ्रंट-एंड के लिए अधिक उन्नत पेजिंग नेविगेशन के साथ एक प्लगइन है। आप [admin-menu]यहाँ उपयोग कर सकते हैं, लेकिन मुझे नहीं लगता कि यह वास्तव में उससे संबंधित है। मैंने टैग को बदल दिया है जो मुझे लगता है कि यह फिट बैठता है, आप निश्चित रूप से इसे फिर से संपादित कर सकते हैं।
Jan Fabry

@Jan Fabry: री-टैगिंग के लिए धन्यवाद ... पूरे टैग पूल से परिचित नहीं, फिर भी (स्पष्ट रूप से)।
विर्फेल

जवाबों:


28

अंगूठे के एक नियम के रूप में, आपको अधिकांश कार्यों के लिए एक POST अनुरोध का उपयोग करना चाहिए, यह सुनिश्चित करने के लिए कि वे दुर्घटना से निष्पादित नहीं होते हैं । लेकिन पोस्ट के अनुरोध के बाद सामान्य पृष्ठ पर पुनर्निर्देशित करना भी एक अच्छा अभ्यास है, जब उपयोगकर्ता पृष्ठ को ताज़ा करने पर डुप्लिकेट निष्पादन को रोक सकता है।

तो प्रवाह इस तरह है:

  1. आपका प्लगइन पृष्ठ एक POST फॉर्म के साथ, जो सबमिट करता है
  2. एक पृष्ठ जो अनुरोध को संभालता है, जिसे पुनर्निर्देशित करता है
  3. आपका प्लगइन पृष्ठ, जो कार्रवाई का परिणाम दिखाता है

मध्य पृष्ठ को आपका प्लगइन पृष्ठ नहीं होना चाहिए। इसका मतलब है आप उपयोग कर सकते हैं कि "सामान्य पोस्ट हैंडलर" कि तीन साल पहले शामिल किया गया था, में हुक'admin_action_' . $_REQUEST['action']admin.php

एक उदाहरण उपयोगकर्ता Akismet प्लगइन है । यदि आप इसे मज़बूती से उपयोग करना चाहते हैं, तो आपको admin.phpसीधे ही प्रस्तुत करना होगा , न कि किसी अन्य पृष्ठ पर, जिसमें शामिल होना है admin.php

यहां इसका उपयोग करने का एक बहुत ही बुनियादी उदाहरण दिया गया है:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}

हे, मैं फिर से कोड को देखूंगा, मैंने स्पष्ट रूप से वह नहीं देखा, लेकिन सिर्फ पुष्टि करने के लिए ... तो आप क्या कह रहे हैं कि अगर मैं admin.php को सीधे पेज पैरामीटर के बिना कॉल करता हूं, तो यह सभी पेज को छोड़ देता है लोड हो रहा है और बस कुछ इनिशियलाइज़ेशन करता है और हुक चलाता है? यह भयानक होगा ... ish (मैं अभी भी नहीं मिलता है कि उन्होंने पृष्ठ लोड करने से पहले हुक क्यों नहीं लगाया)।
wyrfel

@ वायफेल: हां, admin.phpसीधे कॉल करना "चाल" है जिसे अकिस्मेट स्रोत ने मुझे सिखाया है। जब आप एक फ़ॉर्म प्रदर्शित कर रहे होते हैं तो आप सही होते हैं और त्रुटियों के मामले में इसे फिर से प्रदर्शित करना चाहते हैं: तब यह आसान होगा यदि गंतव्य आपका प्लगइन पृष्ठ है, लेकिन प्रारंभ में कहीं पर हुक है (इसलिए आप सफल होने पर पुनर्निर्देशित कर सकते हैं, या प्रदर्शित कर सकते हैं। त्रुटि संदेशों के साथ फिर से फार्म यदि नहीं)। शायद यह एक Trac टिकट में सुझाव है?
Jan Fabry

मैं टिकट दर्ज करूंगा। वर्कअराउंड के रूप में, मुझे 'load-<pagehook>'काम करने के लिए हुक मिला ... पृष्ठ लोड होने से पहले इसे कॉल किया जाता है ... लेकिन admin_action_...अवधारणा पूरी तरह से अच्छे और अधिक विशिष्ट लगती है। इसके अलावा, एक नोट पर, त्रुटि संदेश अभी भी समस्याग्रस्त हैं यदि आप POST करते हैं और फिर से लोड नहीं करना चाहते हैं, लेकिन यह एक अलग विषय है।
वाइरफेल

@ वायफेल: त्रुटि संदेश अभी भी समस्याग्रस्त क्यों होंगे? यदि कोई त्रुटि संदेश है, तो पृष्ठ पर रहें और संदेशों के साथ फिर से फ़ॉर्म प्रदर्शित करें (निश्चित रूप से एक ताज़ा यहां बहुत अर्थ नहीं होगा - लेकिन यह भी कोई नुकसान नहीं करेगा, क्योंकि त्रुटियां अभी भी होंगी और कोई कार्रवाई नहीं होगी) सज़ा पाएं)। यदि कोई त्रुटि नहीं है, तो कार्रवाई को निष्पादित करें और "सुरक्षित" अवलोकन पृष्ठ पर पुनर्निर्देशित करें। यह काम करेगा - अगर admin_action_हुक को प्लगइन पेज लोडर से पहले ले जाया जाएगा।
Jan Fabry

ठीक है ... मैं बहुत जटिल सोच रहा था।
विर्फ़ेल

3

मैंने इस पर थोड़ा अलग तरीके से संपर्क किया, केवल उस पेज पर एक्शन url के लिए = उपयोगकर्ता द्वारा कार्रवाई करने के लिए सही URL पर कार्रवाई करना

मेरा हैंडलर तब क्रिया करता है (यानी, आम तौर पर एक ऐड, अपडेट या डिलीट) तो एक wp_redirect () को अगले पेज एक्शन (जैसे पेज जोड़ें -> पृष्ठ संपादित करें, पृष्ठ हटाएं -> सूची पृष्ठ, संपादन पृष्ठ - संपादित पृष्ठ) को समाप्त करता है। )। मैं URL पर एक संदेश भी देता हूं ताकि मैं एक स्थिति प्रदर्शित कर सकूं जैसे कि अद्यतन सफलतापूर्वक या विफल।

यह दृष्टिकोण सभी क्रियाओं को रखता है: एक ही वर्ग में सूची, जोड़ें, संपादित करें, हटाएं, बल्क-डिलीट, आदि और एक ही व्यवस्थापक स्लग के साथ इसलिए इसे बनाए रखना और समझना बहुत आसान है।


यार, तुम जीनियस हो! मैं दो दिनों से सीधे संघर्ष कर रहा हूं और ऐसा प्रतीत होता है कि मुझे "noheader = true" भाग की आवश्यकता थी। धन्यवाद!
r00m

0

एक और अलग दृष्टिकोण सिर्फ एक छिपे हुए इनपुट फ़ील्ड को फॉर्म में जोड़ना है:

<input type="hidden" name="page" value="your-page-slug" />

इस तरह, वर्डप्रेस अपने आप रीडायरेक्ट को हैंडल करने लगता है।

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