web-dev-qa-db-fra.com

Appelez add_action de manière conditionnelle en fonction de post_type?

Lors de la construction d'un plugin, je sais que vous pouvez vous connecter à une fonction pour exécuter du code tel que

add_action('admin_footer', array($this, 'custom_function'));

Et dans cette fonction, testez post_type comme ceci:

public function custom_function() {
            $screen = get_current_screen();
            if (self::CUSTOM_POST_TYPE == $screen->post_type) {
                // Do something
            }
        }
}

Sur l'ensemble du plugin, je teste le post_type de l'écran dans de nombreuses fonctions différentes.

Dans l’esprit de D.R.Y., ma question est la suivante: existe-t-il un moyen d’ajouter de manière conditionnelle les actions d’un groupe en fonction du post_type actuel? Au lieu d'avoir beaucoup de fonctions qui font le même test pour le post_type comme:

    public function custom_function_1() {
                $screen = get_current_screen();
                if (self::CUSTOM_POST_TYPE == $screen->post_type) {
                    // Do something
                }
            }
    }
    public function custom_function_2() {
                $screen = get_current_screen();
                if (self::CUSTOM_POST_TYPE == $screen->post_type) {
                    // Do something
                }
            }
    }

est-il possible de tester le post_type et ensuite d'appeler les actions nécessaires pour ce type de post, par exemple:

$screen = get_current_screen();
if (self::CUSTOM_POST_TYPE == $screen->post_type) {
    add_action('admin_footer', array($this, 'custom_footer_function'));
    add_action('save_post', array($this, 'custom_save_function'));
    add_action('delete_post', array($this, 'custom_delete_function'));
    add_filter('enter_title_here', array($this, 'custom_title_placeholder'));
}

où le test conditionnel peut être supprimé de toutes les fonctions?

Existe-t-il un point particulier où un test et des appels comme celui-ci pourraient avoir lieu, de sorte que de nombreuses fonctions du plug-in n'ont pas nécessairement le même code?

Merci pour tout conseil.

2
edeneye

En utilisant OOP PHP, ajoutez vos actions d’initialisation dans le __construct et créez les méthodes appropriées pour les gérer. À partir de votre gestionnaire, vous pouvez initialiser n’importe quelle variable de classe (une fois) et la référencer ultérieurement sans avoir à effectuer de vérifications supplémentaires. Voici un exemple:

class my_plugin {
    private $post_type;
    private $isCustom = false;

    public function __construct() {
        add_action( 'admin_init', array( $this, 'admin_init' ) );
    }

    public function admin_init() {
        // This method is called only once, so do any initialization here.
        $this->post_type = get_current_screen()->post_type;
        $this->isCustom = self::CUSTOM_POST_TYPE == $this->post_type;
        if ( $this->isCustom ) {
            add_action('admin_footer', array($this, 'custom_footer_function'));
            add_action('save_post', array($this, 'custom_save_function'));
            add_action('delete_post', array($this, 'custom_delete_function'));
            add_filter('enter_title_here', array($this, 'custom_title_placeholder'));
        }
    }
}
2
Twifty
add_Action('init','call_it_to_hook');
function call_it_to_hook() {
    global $post;
    if($post->post_type == 'custom_post_type') {
        add_Action('hook name', 'callback_function');
    }
}

callback_function() {
echo "hey";
// thats my place , can do whatever i want here
}
1
codepixlabs