web-dev-qa-db-fra.com

Ecraser les fonctions principales de Wordpress avec des plugins

Existe-t-il un moyen d'écraser une fonction principale en utilisant un plugin, le noyau Wordpress? Je n'ai pas besoin d'injecter de code, je dois remplacer entièrement la fonction par une version réécrite.

La fonction spécifique est wp_nav_menu_item_post_type_meta_box () dans /wp-admin/includes/nav-menu.php

Fondamentalement, il y a un manque de fonctionnalités qui ne répondent pas aux besoins des clients. Je dois donc écraser cette fonction avec celle que j'ai créée. J'ai apporté de lourdes modifications à la fonction et je souhaite pouvoir écraser la fonction par la mienne via un plug-in au lieu de modifier directement le fichier.

Je sais que ce n'est probablement pas beaucoup mieux que de pirater le noyau, mais c'est une solution immédiate et temporaire.

3
Dave Hunt

Non, pas vraiment. Vous pouvez remplacer les fonctions intégrées PHP, mais pas les fonctions définies par l'utilisateur.

Cependant, cette fonction ne fait que définir une boîte à méta. Pourquoi ne pas définir le vôtre?

Une fois que vous avez défini et ajouté votre propre méta-boîte, vous pouvez appeler remove_meta_box pour supprimer celle standard:

remove_meta_box( 'add-POSTTYPENAME', 'nav-menus', 'side');

La méta-boîte est ajoutée à l'origine pour chaque type de publication personnalisé à l'aide d'une boucle. L'ID de la boîte à méta est défini par add-{$id}, où $id est le nom du type de publication. Vous pouvez donc supprimer cette méta-boîte pour tous les types de publication en effectuant une boucle similaire ou uniquement pour un type de publication spécifique. C'est à vous.

Ensuite, ajoutez simplement votre méta-boîte personnalisée pour les types de publication dont vous avez besoin. Voici la fonction qui ajoute l'original pour référence:

function wp_nav_menu_post_type_meta_boxes() {
      $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' );

      if ( ! $post_types )
          return;

      foreach ( $post_types as $post_type ) {
          $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );
          if ( $post_type ) {
              $id = $post_type->name;
              add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type );
          }
      }
}
7
EAMann

Voici une fonction qui vous permettra de supprimer les boîtes de méta définies par wp (même les valeurs par défaut) dans la page nav-menus.php. En supprimant la boîte de méta, vous supprimez également l'option de case à cocher de l'onglet "Options d'écran".

Un appel de fonction autonome remove_meta_box() ne fonctionnera pas car, comme l’a dit EAMann, les boîtes sont définies par l’utilisateur. Vous devez vérifier le statut d'administrateur de l'utilisateur avant de pouvoir le supprimer.

Vous pouvez placer cette fonction dans votre thème functions.php sans modifier les fichiers wp-admin.

function hide_meta_in_custom_menu_admin() {

    global $pagenow;
    global $current_user;

    get_currentuserinfo();

    $user_login=$current_user->user_login;

    if($user_login=="scholar") {
    //nothing
    } else {
        if (is_admin() && $pagenow=='nav-menus.php') {
            remove_meta_box('add-custom-links', 'nav-menus', 'side');
            remove_meta_box('nav-menu-theme-locations', 'nav-menus', 'side');
            remove_meta_box('add-category', 'nav-menus', 'side');
        }
    }
}

add_action( 'admin_head', 'hide_meta_in_custom_menu_admin'  );

Code plus simple, à supprimer pour tout utilisateur.

function hide_meta_in_nav_menu() {

    global $pagenow;

    if (is_admin() && $pagenow=='nav-menus.php') {
        remove_meta_box('add-custom-links', 'nav-menus', 'side');
        remove_meta_box('nav-menu-theme-locations', 'nav-menus', 'side');
        remove_meta_box('add-category', 'nav-menus', 'side');
    }
}
add_action( 'admin_head', 'hide_meta_in_nav_menu'  );
0
Jon