Özel toplu işlem


17

Özel bir yazı türüne özel bir toplu işlem eklemek istiyorum. Ben filtrenin geldi bulk_actions-screenid, onun uygun dokümantasyon , ben dilek tam olarak yapardı . Ancak, yaklaşık iki saat hata ayıklama sonra // This filter can currently only be used to remove actions.class-wp-list-table.php 278 satırında aşağıdaki yorumu buldum - harika!

Bir seçenek olarak eylem enjekte etmek için jQuery kullanarak kesmek olabilir düşündüm

/**
 * 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
}

Bu çalışıyor. İşlem artık toplu işlemler menüsünde görünür. Daha sonra admin_initgerekli işlemleri yapmak için bazı mantık ekleyebileceğim varsayımı altındaydım - ancak, create_invoicehiç gönderilmedi. Yanlış yaptığım bir şey var mı?

=== GÜNCELLEME ===

load-*Kancayı kullanmak için kodu güncelledim . Users.php üzerinde toplu işlemi uyguladığımda - create_invoiceistek üzerinden geçtiğini görüyorum . Ancak edit.php create_invoiceüzerinde hiçbir zaman yazdırılmaz.

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
Belki bu cevap gelecekte birine yardımcı olacaktır. İşte bunu yapmanın bir yolu: Bir WordPress Özel Toplu Eylem Ekleme
Ayoub

Önceki yorumdaki bağlantı değişti. Makaleyi hala burada okuyabilirsiniz .
morphatic

1
Bu yakında wordpress'te düzeltilecek gibi görünüyor. Core.trac.wordpress.org/ticket/16031 bileti henüz Ekim ' 16'nın sonunda kapatıldı.
Denise Draper

Yanıtlar:


2

Bence en son büyük sürüm, bu sorunun popülerliğini göz önünde bulundurarak bu soruya yeni bir cevap gerektiriyor.

WordPress 4.7'den (Aralık 2016'da piyasaya sürüldüğünden) JavaScript kullanmadan özel toplu işlemler eklemek mümkündür.

Filtre bulk_actions-{$screen}(örneğin bulk_actions-edit-pagesayfalara genel bakış için) artık özel toplu işlemler eklemenize izin veriyor. Ayrıca, handle_bulk_actions-{$screen}(örn. handle_bulk_actions-edit-page) Adlı yeni bir eylem , eylemin yürütülmesini gerçekleştirmenize olanak tanır.

Bütün bunlar bu blog yazısında oldukça iyi açıklanmıştır . Örneğin, sayfalara genel bakışta seçilen öğelerin başlıklarını e-postayla göndermek için toplu bir işlem eklemek istediğimizi varsayalım. Bunu şu şekilde yapabiliriz:

Toplu işlemler açılır menüsüne bir eylem eklediğimiz ve buna bir işleyici işlevi eklediğimiz küçük bir örnek için.

Açılır listeye toplu işlem ekleme:

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' );

Toplu işlem için bir işleyici ekleme:

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 );

Bu işleyici eylemi benim için işe yaramıyor. WordPress 4.7.2 kullanıyorum. Bu konuda herhangi bir yardım için teşekkür ederiz. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak

@MariaDanielDeepak'da ne çalışmıyor? Benim için 4.7.2 iyi çalışıyor. Dikkate alınması gereken birkaç nokta: (1) Geri arama, yöneticideki "Sayfalar" genel bakışı içindir ( edit-pagebölüm ekran kimliği olduğu için) (2) Hiçbir sayfa seçilmezse eylem yürütülmez (örn. boş bir sayfa kümesinde toplu işlem)
engelen

Yorumunuz için teşekkür ederim. WordPress forumunda çalışmayanların tam açıklamasını ekledim .
Maria Daniel Deepak

9

bulk_actions-*Daha sonra bir o eylem için bir işleyici eklemek için zor çünkü filtre hassas özel toplu eylemler eklemek için izin vermez. Kodeks güncellendi.

Bunun load-*yerine eylemi kullanmanızı öneririm admin_init. Check_ajax_referrer () ve current_user_can () gibi tüm güvenlik kontrollerini yapmanız gerektiğini unutmayın.


Teşekkürler! load-*Kanca çalışıyor gibi görünüyor. Ayrıca, kodeksi güncellediğiniz ve trac biletini yeniden açtığınız için teşekkür ederiz.
v0idless

1
Cevabı erken kabul etmiş olabilirim. load-*Kancayı kullanmak için kodu güncelledim . Users.php üzerinde toplu işlemi uyguladığımda - create_invoiceistek üzerinden geçtiğini görüyorum . Ancak edit.php create_invoiceüzerinde hiçbir zaman yazdırılmaz.
v0idless

exit;Sonra bir çağrı eklemeyi deneyinecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu

1
Bence daha iyi bir eylem kancası var load-*: admin_action_*( admin_action_create_invoicesizin durumunuzda). Kancadan hemen sonra load-*ve yalnızca özel toplu işlem tetiklendiğinde çağrılır .
Fabien Quatravaux

0

Nesne tanımlandığında bulk_actionsfiltreler kullanmalısınız WP_Screen. bunun gibi:

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' );
    }
}    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.