कस्टम थोक_कारण


17

मैं एक कस्टम पोस्ट प्रकार में एक कस्टम बल्क क्रिया जोड़ना चाहूंगा। मैं फ़िल्टर भर में आया था bulk_actions-screenid, जो इसके दस्तावेज़ीकरण के अनुसार , जैसा मैं चाहता हूँ, वैसा ही करेगा । हालाँकि, लगभग दो घंटे की डिबगिंग के बाद, मुझे // This filter can currently only be used to remove actions.क्लास-wp-list-table.php - महान की लाइन 278 पर निम्न टिप्पणी मिली !

मुझे लगा कि मैं विकल्प के रूप में कार्रवाई को इंजेक्ट करने के लिए jQuery का उपयोग करके इसे हैक कर सकता हूं

/**
 * Hack to add a custom bulk action. 
 */
public function admin_footer() {
    if($_GET['post_type'] != self::POST_TYPE) return;
    ?> 
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
        });
    </script>
    <?php
}

यह काम। अब कार्रवाई बल्क एक्शन मेनू में दिखाई देती है। मैं इस अनुमान के तहत था कि मैं admin_initआवश्यक प्रसंस्करण करने के लिए कुछ तर्क जोड़ सकता हूं - हालांकि, ऐसा प्रतीत होता है कि create_invoiceकभी भी पोस्ट नहीं किया गया है। क्या मैं कुछ गलत कर रहा हूं?

=== अद्यतन ===

मैंने load-*हुक का उपयोग करने के लिए कोड को अपडेट किया । जब मैं users.php पर बल्क एक्शन लागू करता हूं - मैं देखता हूं create_invoiceकि अनुरोध के माध्यम से पारित किया गया है। हालाँकि, edit.php create_invoiceपर कभी भी प्रिंट नहीं किया जाता है।

function a39x2_admin_footer() {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action2']");
        });
    </script>
    <?php
}
add_action('admin_footer', 'a39x2_admin_footer');


function a39x2_load() {
    echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
}
add_action('load-edit.php', 'a39x2_load');
add_action('load-users.php', 'a39x2_load');

1
यह उत्तर भविष्य में किसी की मदद करेगा। यह करने का एक तरीका है: वर्डप्रेस कस्टम बल्क एक्शन जोड़ें
अय्यूब

पिछली टिप्पणी में लिंक बदल गया है। आप अभी भी यहां लेख पढ़ सकते हैं
मूरफैटिक

1
लगता है कि यह जल्द ही वर्डप्रेस में तय हो जाएगा। टिकट core.trac.wordpress.org/ticket/16031 अक्टूबर '16 के अंत में बंद हो गया था।
डेनिस ड्रेपर

जवाबों:


2

मुझे लगता है कि नवीनतम प्रमुख रिलीज वारंट इस सवाल की लोकप्रियता को देखते हुए इस सवाल का एक नया जवाब देता है।

चूंकि वर्डप्रेस 4.7 (दिसंबर 2016 को जारी) में जावास्क्रिप्ट का उपयोग किए बिना कस्टम बल्क क्रियाओं को जोड़ना संभव है।

फ़िल्टर bulk_actions-{$screen}(जैसे bulk_actions-edit-pageपृष्ठों के अवलोकन के लिए) अब आपको कस्टम बल्क क्रियाओं को जोड़ने की अनुमति देता है। इसके अलावा, एक नई कार्रवाई handle_bulk_actions-{$screen}(जैसे handle_bulk_actions-edit-page) आपको कार्रवाई के निष्पादन को संभालने की अनुमति देती है।

यह सब इस ब्लॉग पोस्ट में बहुत अच्छी तरह से समझाया गया है । उदाहरण के लिए, मान लें कि हम पृष्ठों के अवलोकन पर चयनित वस्तुओं के शीर्षकों को ईमेल करने के लिए एक बल्क एक्शन जोड़ना चाहते हैं। हम इसे इस तरह कर सकते हैं:

एक छोटे से उदाहरण के लिए, जहां हम बल्क एक्शन ड्रॉपडाउन में एक एक्शन जोड़ते हैं और इसमें हैंडलर फंक्शन जोड़ते हैं।

ड्रॉपडाउन में बल्क एक्शन जोड़ना:

function wpse29822_page_bulk_actions( $actions ) {
    // Add custom bulk action
    $actions['my-action-handle'] = __( 'My Custom Bulk Action' );
    return $actions;
}
add_action( 'bulk_actions-edit-page', 'wpse29822_page_bulk_actions' );

बल्क एक्शन के लिए हैंडलर जोड़ना:

function wpse29822_page_bulk_actions_handle( $redirect_to, $doaction, $post_ids ) {
    // Check whether action that user wants to perform is our custom action
    if ( $doaction == 'my-action-handle' ) {
        // Do stuff
    }
    return $redirect_to;
}
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );

यह हैंडलर कार्रवाई मेरे लिए काम नहीं करती है। मैं वर्डप्रेस 4.7.2 का उपयोग कर रहा हूं। मैं इस पर किसी भी मदद की सराहना करेंगे। add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
मारिया डैनियल दीपक

@MariaDanielDeepak क्या काम नहीं कर रहा है? यह मेरे लिए 4.7.2 पर ठीक काम कर रहा है। कुछ बातों पर विचार करें: (1) कॉलबैक एडमिन में "पेज" अवलोकन के लिए है (जैसा कि edit-pageइसका स्क्रीन आईडी है) पृष्ठों के एक खाली सेट पर बल्क एक्शन)
संलग्न करें

मैं आपकी टिप्पणी की सराहना करता हूं। मैंने वर्डप्रेस फोरम में क्या काम नहीं कर रहा है, इसका पूरा विवरण जोड़ा है ।
मारिया डैनियल दीपक

9

bulk_actions-*फिल्टर क्योंकि यह मुश्किल है तो एक है कि कार्रवाई के लिए कोई हैंडलर जोड़ने के लिए ठीक कस्टम बल्क कार्रवाइयों को जोड़ने के लिए अनुमति नहीं है। कोडेक्स अपडेट किया गया।

मैं load-*इसके बजाय कार्रवाई का उपयोग करने का सुझाव दूंगा admin_init। ध्यान दें कि आपको सभी सुरक्षा जांच जैसे Check_ajax_referrer () और current_user_can () करना होगा।


धन्यवाद! load-*हुक काम कर रहा है। इसके अलावा, कोडेक्स को अपडेट करने और ट्रेक टिकट को फिर से खोलने के लिए धन्यवाद।
v0idless

1
मैंने समय से पहले जवाब स्वीकार कर लिया हो सकता है। मैंने load-*हुक का उपयोग करने के लिए कोड को अपडेट किया । जब मैं users.php पर बल्क एक्शन लागू करता हूं - मैं देखता हूं create_invoiceकि अनुरोध के माध्यम से पारित किया गया है। हालाँकि, edit.php create_invoiceपर कभी भी प्रिंट नहीं किया जाता है।
v0idless

exit;बाद में एक कॉल जोड़ने की कोशिश करेंecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu

1
मुझे लगता है load-*कि admin_action_*( admin_action_create_invoiceआपके मामले में) : से बेहतर एक्शन हुक है । इसे load-*हुक के ठीक बाद कहा जाता है , और केवल तब जब कस्टम बल्क कार्रवाई चालू हो जाती है।
फाबिएन क्वात्रावाक्स

0

ऑब्जेक्ट परिभाषित bulk_actionsहोने पर आपको फ़िल्टर का उपयोग करना चाहिए WP_Screen। इस तरह:

add_action( 'current_screen', 'custom_bulk_actions' );
function custom_bulk_actions() {
    if( current_user_can( 'administrator' ) {
        add_filter( 'bulk_actions-edit-post'       , 'register_custom_bulk_actions' );
        add_filter( 'handle_bulk_actions-edit-post', 'custom_bulk_action_handler', 10, 3 );
        add_action( 'admin_notices'                , 'custom_bulk_action_admin_notice' );
    }
}    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.