İşlem nasıl yapılır ve iade değeri nasıl alınır?


10

Yani şu senaryo var.

Günlükleri veritabanından temizlemek için bir eylem ekliyorum:

add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

Şimdi bu eylemi periyodik olarak çalıştırmak istiyorum:

wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );

ve manuel olarak yürütün:

do_action( 'myplugin_clean_logs' );

Yöntem MyPlugin_Logs::clean_logs, etkilenen satırların sayısını döndürür veya bir şey başka yöne gittiğinde false değerini döndürür.

Şimdi silinen satır sayısını görüntülemek istiyorum. Ben böyle bir şey hayal ediyorum:

$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';

Ama do_actionherhangi bir değer döndürmez gibi , dönüş değeri almak için hiçbir fikrim yok.

Yöntemi doğrudan manuel olarak çalıştırmalı mıyım, ancak eylemi zamanlama olaylarında mı kullanmalıyım?


1
Zamanlanmış bir olayda hiçbir şey yankılamak istemiyorsunuz, bu yüzden evet, yöntemi doğrudan manuel olarak çalıştırırım (yöneticinin bunu tetikleyeceğini varsayıyorum ve çıktıyı göstermek istiyorsunuz).
Tim Malone

Yanıtlar:


13

Harika olan şey, bir filtrenin bir eylemle aynı olmasıdır, sadece bir değer döndürür, bu yüzden bunun yerine bir filtre olarak ayarlayın:

add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

Sonra şöyle bir şey:

$affected_rows = '';
$affected_rows = apply_filters( 'myplugin_clean_logs', $affected_rows );

geçmelidir $affected_rowsiçin clean_logs()(ve size kanca sahip olabilecek diğer her türlü fonksiyonları myplugin_clean_logs) ve dönüş değeri geri atamak $affected_rows.


4
Bu yazılım geliştirmek yerine kod kesmek olduğu için indirildi. Eğer eylemler sadece bir filtre altkümesi olsaydı, bunlara hiç gerek olmazdı. Cron, buggy shemigans yapmanıza izin verse bile, bu yüzden bir filtre olarak kanca olmamalıdır değer geçemez :)
Mark Kaplun

1
Alınan nokta. İki farklı şeyin amacını anlıyorum , ama burada temel koda bakmak için, her do_action()şey apply_filters():) 'nin ayrıntılı bir hacklemesinden başka bir şey değildir.
Caspar

kısmen böyle bir soruna yol açan karışıklığa neden olan tek kötü tasarım değil
Mark Kaplun

1
Biz Bakış Mark'ın Anlamadığım nokta ise bu yüzden hala bu yasal bir cevap olduğunu düşünüyorum, elimizde ne çalışmak gerekir - olmadıkça çekirdek gelecekte bu yaklaşımını değiştirdi elbette, ama büyük geriye dönük uyumluluk sorunları olası nedeniyle düşünüyorum tanıtırdı.
Tim Malone

3
Teşekkürler, @TimMalone. @ Mark-kaplun'un itirazını takdir ediyorum. Cevabım, do_action()bir çözümün do_action()amacına uygun olarak nasıl tasarlanacağından ziyade bir değer döndürmemek için nasıl çalışılacağını açıklar . Birisi istediği şeyi yapabiliyorsa, bu cevap kabul edilen cevap olmayı hak eder. İlk düşüncem, çengel yönteminin (OP'nin bu eklenti için bir OOP tasarımı kullandığını varsayarak) eklenti sınıfının korumalı bir özelliğine düşmesi ve daha sonra bazı noktalarda çıkarmak için hızlı bir alıcı yazmasıdır. Ama bu sadece bir fikrin vahşi saçları!
Caspar

-1

Bu işlevi hiç kullanmadınız ve test etmediniz, ama işe yarayabilir mi? do_action_ref_array () .

function myplugin_clean_logs_fn() {
    $args = array(
        'param1'        => 'val1',
        'param2'        => 'val2',
        'affected_rows' => 0,
    );
    do_action_ref_array( 'myplugin_clean_logs', &$args );
    return $args['affected_rows'];
}

// CALL IT
$affected_rows = my_plugin_clean_logs();
echo $affected_rows .' entr'. ($args['affected_rows']*1===1?'y':'ies') .' deleted.';

// SCHEDULE IT
add_action('myplugin_clean_logs_call_fn', 'myplugin_clean_logs_fn');
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs_call_fn' );

// A SAMPLE FILTER
add_action('myplugin_clean_logs', function($args) {
    // Cleaning process
    // For each log affected, increment $args['affected_rows'] accordingly
}, 10, 3);

Bu işe yaramazsa, neden sadece Caspar'ın önerdiği şeyi filtrelemiyor? Yani, bu bir filtrenin amacıdır ve bu durumda etkilenen satırların sayısı filtrelenen şeydir. (Eski MortCore'u özlüyorum. Herkes, tek bir üç parametre işleviyle dönüş değerlerini, doğrudan referansı ve bağımsız değişkenleri nasıl ele aldığını hatırlıyor mu?)


Bu korkunç bir cevaptır, çünkü değerleri referans olarak vermek ve değiştirmek, gerçekten kötü bir uygulamadır. Dürüst olmak gerekirse, bu cevap gerçekten soru bağlamında değer sağlamaz ve büyük olasılıkla kaldırılması veya bir yorum olarak değiştirilmesi gerekir. Ek olarak, kancalarla anonim işlevlerin kullanılması, kancaların çıkarılmasını imkansız hale getirdiği için kötü bir uygulamadır.
Hybrid Web Dev

Yukarıda belirtilen nedenlerle, bunun önerilen bir yol olmadığını kabul ediyorum. Herhangi bir nedenle bir eylemden bir dönüş değeri almanız ve hızlı ve kirli bir şeye ihtiyacınız varsa, Caspars çözümünü tercih ederim. Önde bir yaşam döngüsü olan bir şey geliştiriyorsanız, daha sağlam bir yol ararım. Düşünmeye gelince, yönetici bildirimlerine ne dersiniz? developer.wordpress.org/reference/hooks/admin_notices
jgangso
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.