ब्लॉग
गाइडWordPressRefined Admin Dashboard

WordPress एडमिन पर नोटिसों का कब्ज़ा कैसे रोकें

Raphaël, Robot sensible 6 मिनट पढ़ाई
WordPress एडमिन पर नोटिसों का कब्ज़ा कैसे रोकें

आप एक टाइपो ठीक करने के लिए एडमिन खोलते हैं। पेज तक आप पहुँचें, उससे पहले चार संदेश वहाँ पहुँच चुके होते हैं: एक बैकअप प्लगइन चाहता है कि आप रिन्यू करें, एक फ़ॉर्म प्लगइन को पाँच स्टार मिल जाएँ तो बड़ी ख़ुशी होगी, एक SEO प्लगइन के पास एक टिप है, और एक कैश प्लगइन ने अपना कैश साफ़ किया है और उसे लगा कि आपको यह पता होना चाहिए। उन सबको स्क्रॉल करके पार करते-करते टाइपो ठीक करने की जल्दी ही ख़त्म हो जाती है।

WordPress और प्लगइन नोटिसों के ज़रिए ही आप तक पहुँचते हैं, और उनमें से कुछ को पहुँचना भी चाहिए: फ़ेल हुआ बैकअप, फ़ैटल एरर के बाद रोका गया प्लगइन, कोई लाइसेंस जो शुक्रवार को ख़त्म हो रहा है। बाकी सब मार्केटिंग है, उसी रंगीन बॉर्डर के साथ, उसी जगह, हर स्क्रीन के सबसे ऊपर।

नोटिसों का ढेर क्यों लगता है

WordPress हर एडमिन पेज के ऊपरी हिस्से में admin_notices नाम का एक हुक चलाता है। कोई भी प्लगइन वहाँ जो चाहे छाप सकता है, और WordPress अपने संदेशों के लिए भी यही हुक इस्तेमाल करता है, जैसे कोर अपडेट का बैनर या रिकवरी मोड द्वारा रोके गए प्लगइनों की चेतावनी। WordPress न कोई सीमा तय करता है, न महत्व का कोई क्रम।

छोटा-सा क्रॉस उतनी मदद नहीं करता जितनी आप सोचते हैं। खारिज किए जा सकने वाले नोटिस पर WordPress एक बंद करने का बटन जोड़ता है, और वह बटन नोटिस को सिर्फ़ आपके सामने वाले पेज से हटाता है। आपका क्लिक याद रखना प्लगइन का काम है। बहुत-से प्लगइन यह करते हैं। बाकी अगली स्क्रीन पर फिर से नमस्ते करते मिलते हैं, जैसे कुछ हुआ ही न हो।

दो झटपट नुस्ख़े, दोनों थोड़े अंधाधुंध

पहला है CSS की एक लाइन जो हर .notice को छिपा देती है। दूसरा है remove_all_actions( 'admin_notices' ), जो WordPress को उन्हें छापने से ही रोक देता है।

दोनों स्क्रीन का ऊपरी हिस्सा साफ़ कर देते हैं। साथ ही वे कल रात फ़ेल हुए बैकअप की चेतावनी भी छिपा देते हैं, और इसका पता आपको उसी दिन चलता है जिस दिन आपको वह बैकअप चाहिए होता है।

नोटिस सिर्फ़ एडमिनिस्ट्रेटरों के लिए रखें

जो साइटें आप बनाकर सौंपते हैं, उन पर एक ठीक-ठाक बीच का रास्ता निकल आता है: एडमिनिस्ट्रेटरों को हर नोटिस दिखता रहे, बाकी किसी को कोई नहीं। साइट का कंटेंट संभालने वाले व्यक्ति के लिए लाइसेंस के रिमाइंडर का कोई काम नहीं, और वैसे भी वह उस पर कुछ कर नहीं सकता।

यह फ़ाइल wp-content/mu-plugins/quiet-admin-notices.php के रूप में सेव करें। WordPress must-use प्लगइनों को अपने-आप लोड करता है, और Plugins स्क्रीन से कोई उन्हें बंद नहीं कर सकता, जो ऐसे घरेलू नियम के लिए बिल्कुल ठीक है।

<?php
/**
 * Plugin Name: Quiet admin notices
 * Description: Only administrators see admin notices.
 */
add_action( 'in_admin_header', function () {
	if ( current_user_can( 'manage_options' ) ) {
		return;
	}
	remove_all_actions( 'admin_notices' );
	remove_all_actions( 'all_admin_notices' );
	remove_all_actions( 'user_admin_notices' );
	remove_all_actions( 'network_admin_notices' );
}, PHP_INT_MAX );

फ़ंक्शन in_admin_header पर चलता है: WordPress के नोटिस छापने से ठीक पहले, और हर प्लगइन के अपने नोटिस जोड़ लेने के बाद। चारों हुक सामान्य एडमिन, यूज़र डैशबोर्ड और मल्टीसाइट के नेटवर्क एडमिन को कवर करते हैं। जो प्लगइन अपना नोटिस JavaScript से घुसाता है, वह फिर भी निकल आएगा, क्योंकि वह इस हुक के पास से गुज़रा ही नहीं।

जिस नोटिस का नाम पता हो, सिर्फ़ उसे हटाएँ

कभी-कभी बस एक नोटिस को जाना होता है। पहले पता लगाएँ कि उसे छापता कौन है। यह स्निपेट admin_notices पर हुक किए गए हर फ़ंक्शन को आपके एरर लॉग में लिख देता है (wp-content/debug.log, जब WP_DEBUG और WP_DEBUG_LOG चालू हों):

add_action( 'admin_notices', function () {
	global $wp_filter;
	foreach ( $wp_filter['admin_notices']->callbacks as $priority => $callbacks ) {
		foreach ( $callbacks as $callback ) {
			$f = $callback['function'];
			if ( is_array( $f ) ) {
				$class = is_object( $f[0] ) ? get_class( $f[0] ) : $f[0];
				$name  = $class . '::' . $f[1];
			} elseif ( is_string( $f ) ) {
				$name = $f;
			} else {
				$name = 'a closure';
			}
			error_log( "admin_notices, priority $priority: $name" );
		}
	}
}, PHP_INT_MIN );

फिर उसे नाम से हटाएँ, उसी प्रायोरिटी के साथ जिससे उसे जोड़ा गया था। प्रायोरिटी ग़लत हुई, तो remove_action() कुछ नहीं करता, और एक शब्द भी नहीं कहता।

add_action( 'in_admin_header', function () {
	// A plain function, added with the default priority of 10.
	remove_action( 'admin_notices', 'myplugin_renewal_notice' );
	// A static method, added with priority 20.
	remove_action( 'admin_notices', array( 'My_Plugin_Admin', 'review_request' ), 20 );
}, PHP_INT_MAX );

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

इसके बजाय उन्हें इकट्ठा करें

नोटिसों की असली दिक़्क़त उनकी जगह है: हर स्क्रीन के सबसे ऊपर, सब एक साथ, आपके पास एक मिनट हो या न हो। उन्हें एक काउंटर के पीछे रख दें। आपको दिखता है कि कुछ इंतज़ार कर रहा है, आप सूची तब खोलते हैं जब आपको सुविधा हो, और जिस पेज के लिए आप आए थे, वह फिर से सबसे ऊपर होता है। अभी-अभी किए गए किसी काम पर मिलने वाला फ़ीडबैक अलग मामला है: आपने सेव का बटन दबाया, तो «Settings saved» (सेटिंग्स सेव हो गईं) अब भी तुरंत दिखना चाहिए।

Refined Admin Dashboard का नोटिस सेंटर

Refined Admin Dashboard, हमारा मुफ़्त प्लगइन जो पूरे WordPress एडमिन को नए सिरे से बनाता है, नोटिसों को इसी तरह संभालता है, और इसके लिए कोई सेटिंग ढूँढनी नहीं पड़ती। इस प्रक्रिया में किसी भी नोटिस को कोई नुकसान नहीं पहुँचाया गया।

  • WordPress और आपके प्लगइनों के नोटिस पेज के ऊपर दाईं ओर एक सूचनाएँ काउंटर में जाते हैं, उनके साथ वे भी जिन्हें कोई प्लगइन बाद में JavaScript से जोड़ता है।
  • प्लगइन हर नोटिस को बस खिसकाता है: न किसी की कॉपी बनाता है, न किसी को डिलीट करता है। हर नोटिस का अपना बंद करने का बटन बना रहता है, इसलिए जो प्लगइन आपका क्लिक याद रखता है, वह अब भी रखता है।
  • सभी खारिज करें आपकी जगह हर नोटिस का बंद करने का बटन दबा देता है। जिस नोटिस में बंद करने का बटन नहीं है, वह सूची में तब तक रहता है जब तक उसका प्लगइन उसे वापस नहीं ले लेता।
  • आपने अभी जो किया उस पर फ़ीडबैक, जैसे «Settings saved» या किसी फ़ॉर्म की एरर, एक छोटे संदेश के रूप में भी दिखता है जो धीरे-धीरे ग़ायब हो जाता है।
  • जो नोटिस किसी फ़ॉर्म के अंदर रहने के लिए बने हैं, वे वहीं रहते हैं।

प्लगइन लेखकों से एक बात

अगर आप प्लगइन लिखते हैं, तो अपने नोटिस हाथ से लिखे मार्कअप के बजाय wp_admin_notice() (WordPress 6.4 और उसके बाद) से छापें। हर नोटिस को उसका असली टाइप दें (error, warning, success या info), उसे खारिज करने लायक बनाएँ और खारिज किए जाने को याद रखें। उसे अपनी ही स्क्रीनों पर रखें, जब तक पूरी साइट को पता होना ज़रूरी न हो। और कृपया, सेल का बैनर पोस्ट्स की सूची से दूर रखें। आपके यूज़र्स ने वह स्क्रीन पोस्ट लिखने के लिए खोली थी।

अक्सर पूछे जाने वाले प्रश्न

बिना प्लगइन के WordPress में एडमिन नोटिस कैसे छिपाएँ?
एक must-use प्लगइन बनाएँ जो in_admin_header हुक से admin_notices पर remove_all_actions() चलाए। इसे उन भूमिकाओं तक सीमित रखें जो नोटिसों पर कुछ कर ही नहीं सकतीं, ताकि एडमिनिस्ट्रेटरों को फ़ेल हुआ बैकअप या रुका हुआ प्लगइन फिर भी दिखे। कोड इसी लेख में है।
क्या सारे एडमिन नोटिस छिपा देना सुरक्षित है?
पूरी तरह नहीं। एरर और मार्केटिंग एक ही हुक से आते हैं, इसलिए सेल के बैनरों के साथ आप फ़ेल हुआ बैकअप या ख़त्म होता लाइसेंस भी छिपा देते हैं। नोटिस सिर्फ़ उन भूमिकाओं के लिए छिपाएँ जो उन पर कुछ नहीं कर सकतीं, या उन्हें एक जगह इकट्ठा करें।
खारिज किए गए एडमिन नोटिस वापस क्यों आ जाते हैं?
WordPress जो बंद करने का बटन जोड़ता है, वह नोटिस को सिर्फ़ उस पेज से हटाता है जिस पर आप हैं, बस इतना ही। आपका क्लिक याद रखना उस प्लगइन का काम है जिसने नोटिस छापा था, और कुछ प्लगइन याद नहीं रखते।
एडमिन नोटिस सिर्फ़ एडमिनिस्ट्रेटरों को कैसे दिखाएँ?
in_admin_header पर एक फ़ंक्शन हुक करें जो manage_options वाले यूज़र्स के लिए वहीं लौट जाए, और बाकी सबके लिए admin_notices, all_admin_notices, user_admin_notices और network_admin_notices पर remove_all_actions() चलाए। पूरा स्निपेट इसी लेख में है।
क्या Refined Admin Dashboard एडमिन नोटिस डिलीट कर देता है?
नहीं। यह हर नोटिस को «सूचनाएँ» काउंटर में ले जाता है, जिसे आप जब चाहें खोलते हैं, और हर नोटिस का अपना बंद करने का बटन बना रहता है।