web-dev-qa-db-ja.com

プラグインによるコアWordpress関数の上書き

コア機能を上書きする方法はありますかWordpressのコアは、プラグインを使用していますか?コードを注入する必要はありません。関数を完全に書き換えられたバージョンに置き換える必要があります。

特定の関数は/wp-admin/includes/nav-menu.phpの中のwp_nav_menu_item_post_type_meta_box()です。

基本的に、クライアントのニーズを満たしていない機能が不足しているので、この機能を自分で作成したもので上書きする必要があります。私はこの機能に多大な修正を加え、ファイルを直接編集するのではなく、プラグインを介して自分自身でその機能を上書きできるようにしたいと思っています。

私はこれがおそらくコアをハッキングするよりもはるかに優れているわけではないことを知っていますが、それは一時的な即時解決策です。

3
Dave Hunt

いや、いや。組み込みのPHP関数は上書きできますが、ユーザー定義関数は上書きできません。

ただし、この機能が行うことは、メタボックスを定義することだけです。自分で定義しないのはなぜですか。

独自のメタボックスを定義して追加したら、remove_meta_boxを呼び出して標準のものを削除できます。

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

メタボックスは、最初はループを使用してカスタム投稿タイプごとに追加されます。メタボックスのIDはadd-{$id}として定義されます。ここで$idはポストタイプの名前です。そのため、同様のループを実行することによって、または特定の投稿タイプについてのみ、すべての投稿タイプについてこのメタボックスを削除できます。それはあなた次第です。

次に、必要な投稿タイプに合わせてカスタムメタボックスを追加するだけです。これが参照用にオリジナルを追加する関数です。

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

これはnav-menus.phpページ内のwpで定義されたメタボックス(デフォルトでさえ)を削除することを可能にする関数です。メタボックスを削除すると、[画面オプション]タブからチェックボックスオプションも削除されます。

EAMannが言ったように、ボックスはユーザー定義なので、スタンドアロンのremove_meta_box()関数呼び出しは機能しません。削除する前に、ユーザーの管理ステータスを確認する必要があります。

functions.phpファイルを変更することなく、この関数をテーマの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'  );

ユーザーを削除するためのより単純なコード。

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