Add_filter kullanmak için en iyi yer neresi


12

Ben işlevini kullanmalıyım add_filterbenim eklentinin içinde initana eklenti komut eylem kanca ya da sadece?

Bazen insanların her yerde filtre kullandığını ve initkancaya koyarsam, bazı durumlar için çok geç olurdu.

Daha tutarlı bir kod stiline sahip olabilmemiz için action& filterhook'un önceliği hakkında genel bir tavsiye var mı?

Yanıtlar:


15

add_filter()ve add_action()herhangi bir eklenti yüklenmeden önce kullanılabilir. Böylece hem eklentinizin hem de temanızın ilk satırında kullanabilirsiniz.

Okunabilirlik için ana dosyanızın en üstündeki eylem ve filtreleri gruplandırmanızı öneririm:

  • eklentide, eklenti başlığına sahip dosya
  • bir temada functions.php

Bu kural için istisnalar vardır:

  • Zincirleme geri aramalar . Gelen bu örnekte ben bir eylem kayıt shutdowniçin ilk filtre yalnızca wp_nav_menu_objectsadı olmuştur. Dolayısıyla, ikinci geri arama birinciyle aynı anda kaydedilemez.
  • OOP tarzı. Bazen geri aramaları kaydetmeden önce sınıf üyelerini ayarlamanız gerekir. Çok benzer bir örnek kullanarak …

    add_action(
        'plugins_loaded',
        array ( T5_Plugin_Class_Demo::get_instance(), 'plugin_setup' )
    );
    class T5_Plugin_Class_Demo
    {
        public function plugin_setup()
        {
            $this->plugin_url    = plugins_url( '/', __FILE__ );
            $this->plugin_path   = plugin_dir_path( __FILE__ );
            $this->load_language( 'plugin_unique_name' );
    
            // more stuff: register actions and filters
        }
    }
    

    … Sınıfın örneklemesinin başka bir eklenti tarafından durdurulabileceğini ve bir alt sınıfın daha fazla veya farklı filtre ve eylem kaydedebileceğini görüyoruz.

Gruplamaya ek olarak, bir adım daha ileri gidebilir ve diğer geliştiriciler için özelleştirmeleri kolaylaştırmak için özel bir eylem sunabilirsiniz.
İşte üzerinde çalıştığım bir temadan bir örnek:

add_action( 'activate_header',      't5_activate_screen' );
// wp_loaded is too late, WP customizer would not detect the features then.
add_action( 'after_setup_theme',    't5_setup_custom_background' );
add_action( 'after_setup_theme',    't5_setup_custom_header' );
add_filter( 'body_class',           't5_enhance_body_class' );
add_action( 'comment_form_before',  't5_enqueue_comment_reply' );
add_action( 'content_before',       't5_frontpage_widget' );
add_action( 'footer_before',        't5_loop_navigation' );
add_action( 'get_the_excerpt',      't5_excerpt_clean_up', 1 );
add_action( 'header_before',        't5_skiplink', 0, 0 );
add_filter( 'the_title',            't5_fill_empty_title', 20, 1 );
add_action( 'wp_enqueue_scripts',   't5_enqueue_style' );
add_action( 'wp_enqueue_scripts',   't5_enqueue_script' );
add_action( 'wp_loaded',            't5_setup' );
add_action( 'wp_loaded',            't5_page_enhancements' );
add_action( 'wp_loaded',            't5_post_format_support' );
add_action( 'wp_loaded',            't5_load_theme_language' );
add_action( 'wp_loaded',            't5_setup_sidebars' );
add_filter( 'wp_nav_menu_items',    't5_customize_top_menu', 10, 2 );
add_filter( 'wp_nav_menu_args',     't5_nav_menu_args', 10, 1 );
add_filter( 'wp_title',             't5_wp_title_filter', 20, 2 );

add_shortcode( 'gallery',    't5_shortcode_gallery' );
add_shortcode( 'wp_caption', 't5_shortcode_img_caption' );
add_shortcode( 'caption',    't5_shortcode_img_caption' );

// Use this action to unregister theme actions and filters.
do_action( 't5_theme_hooks_registered' );

Son satır önemlidir: Bir alt tema veya bir eklenti t5_theme_hooks_registeredşimdi harekete geçebilir ve önceki kancaların kaydını silebilir. Yani kurtaracak öncelikler ile mücadele ve ben değiştirmek için özgürüm benim geri arama öncelikleri her zaman.

Ancak yalnızca kaynak kodu sırasına güvenmeyin. Doküman bloğunuzda kullandığınız kancaları belgeleyin. Bunun için özel bir etiket kullanıyorum wp-hook. Aynı temanın zincir kancaları ile ilgili bir örnek:

/**
 * Register handler for auto-generated excerpt.
 *
 * @wp-hook get_the_excerpt
 * @param   string $excerpt
 * @return  string
 */
function t5_excerpt_clean_up( $excerpt )
{
    if ( ! empty ( $excerpt ) )
        return $excerpt;

    add_filter( 'the_content', 't5_excerpt_content' );

    return $excerpt;
}
/**
 * Strip parts from auto-generated excerpt.
 *
 * @wp-hook the_content
 * @param   string $content
 * @return  string
 */
function t5_excerpt_content( $content )
{
    remove_filter( current_filter(), __FUNCTION__ );

    return preg_replace( '~<(pre|table).*</\1>~ms', '', $content );
}

Bu işlevlerin nerede çağrıldığını görmek için yukarı kaydırmanız gerekmez, doc bloğuna bir göz atmanız yeterlidir. Bu, biraz çaba gerektirir, çünkü hem senkronizasyonu, kaydı hem de yorumu tutmak zorundasınız, ancak uzun vadede değerli zaman kazandırır.


2
+1. "OOP stili" için tercihim, daha sonra eylemleri / filtreleri yapıcısına (veya uygunsa daha sonra) kaydeden sınıfa / nesneye dağıtmaktır. Daha iyi (OOP!) Kapsülleme sağlar ve sınıf kullanılana / somutlaştırılana kadar kancaların kaydedilmesini önler.
webaware
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.