WordPressの管理メニューに任意のハイパーリンクを追加する方法はありますか(管理ダッシュボードにログインすると左側のメニューになります)。たとえば、Googleへのリンクを追加できますか。
私の特定のケースでは、私が取り組んでいるWordpressテーマのスタイルガイドページを追加して、さまざまなHTML要素がテーマでどのようにスタイル設定されているかをユーザーに示すことができます。
これは私が今まで持っているコードです( 注:それは不完全です ): functions.php Appearance セクションに新しいメニュー項目を追加しました:
add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
add_theme_page('Theme Styleguide', 'Theme Styleguide', 'administrator', basename(__FILE__),'build_styleguide_page');
}
function build_styleguide_page() {
echo "Not sure what goes here to redirect admin to a arbitrary url?";
}
build_styleguide_page()
では、header()
を使ってリダイレクトしようとするとエラーになります( ヘッダー情報を変更できません )。
こんにちは@Tom、
私があなたの質問を正しく理解していれば、メニューにリンクを追加する方法を知る必要はそれほどありませんが(その代わりにリンクを正しくリダイレクトする方法を学ぶ必要があるでしょう)。
もしそうなら、あなたがする必要があるのはメニュー項目関数を使用するのではなく、代わりに "hook" WordPressを使用することで、それはおそらくHTTPヘッダを除いて何も出力しません。 /wp-admin/themes.php
を呼び出すときの最も早いフックはafter_setup_theme
であるように見え、それはうまくいくように見えます。
しかしそれを機能させるには、まずadd_theme_page
フック/あなたのcreate_theme_style_page()
関数でadmin_menu
への呼び出しを変更する必要があります。 5番目のパラメータ(adminオプションを実装するために呼び出す関数)は必要ないので削除し、4番目のパラメータ( "menu slug" )をthemes.php?goto=build-styleguide-page
に変更しました。
4番目のパラメータにはほぼ文字通り何でも選択することができましたが、一貫性を保つための他の外観オプションとして、同じページ(themes.php
)にルーティングしたときにリダイレクトします。 WordPressでは使われていないのでgoto
という名前を思いついたのですが、これは意味があります。
add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
add_theme_page(
'Theme Styleguide',
'Theme Styleguide',
'administrator',
'themes.php?goto=build-styleguide-page'
);
}
ところで、私達はこの解決のためにそれを必要としないので私達はあなたのbuild_styleguide_page()
関数を取り除きました。
themes.php
のリダイレクト:after_setup_theme
最後のコードとして、redirect_from_admin_menu()
関数にafter_setup_theme
フックを実装します。現在のページがthemes.php
であるかどうか、およびURLにgoto
というURLパラメータが渡されていることを確認するためのテストを行います。それからgoto
/switch
ステートメントを使用してcase
の値をテストし、'build-styleguide-page'
の値があるかどうかを確認します。もしそうなら、それはあなたの述べた仮説にリダイレクトします。それ以外の場合、Googleは管理者ダッシュボードにリダイレクトします。
add_action('after_setup_theme', 'redirect_from_admin_menu');
function redirect_from_admin_menu($value) {
global $pagenow;
if ($pagenow=='themes.php' && !empty($_GET['goto'])) {
switch ($_GET['goto']) {
case 'build-styleguide-page':
wp_redirect("http://www.google.com");
break;
default:
wp_safe_redirect('/wp-admin/');
break;
}
exit;
}
}
注:
after_setup_theme
フック/ redirect_from_admin_menu()
関数でswitch
/case
ステートメントを使用することにしたので、必要に応じてgoto
リダイレクトを追加しやすくなります。 case文を追加するだけです。
wp_redirect()
とwp_safe_redirect()
関数は実際には終了しません。 WordPressを停止してリダイレクトを上書きしないようにするには、exitステートメントを明示的に発行する必要があります。
お役に立てれば!
あなたがそれを$submenu
配列に直接追加することによってメニューにあなたが追加するならば、あなたはリダイレクトをする必要性を避けて、そしてメニューリンクとして完全なオフサイトURLを使うことができるでしょう(私はこれを自分でします)。
add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
global $submenu;
$submenu['index.php'][500] = array( 'Menu item name', 'manage_options' , 'http://example.com' );
}
index.php
は親メニューのキー/リンクを表すので、この例では基本的に Dashboard menuに項目を追加します。
確かに、それはadd_{type}_page
関数を使用するほどきれいではありませんが、それはWordPressが管理メニューリンク内のオフサイトURLを防ぐという事実を回避します..
私はいろいろな仮想ホストをメニューに追加するのに似たようなものを使っているので、管理者メニューから直接他のインストールに切り替えることができます(すべてスクリプトで行われますが、基本的に上のコードの賛成バージョンを使います)。
注: コードを使用する場合は、使用中のキー(コード例では500配列のキー)を割り当てないように注意してください。
ヒント: 実際にはメニューキーに負の値を使用することができるので、ネイティブのWordPressアイテムの前にメニューアイテムを強制的に配置することができます。
私はこれで同じことを達成しました:
function add_custom_menu_item(){
add_menu_page( 'Menu Item Title', 'Page Title', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );
function custom_menu_item_redirect() {
$menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;
if($menu_redirect == 'page_slug' ) {
wp_safe_redirect( home_url('/my-page') );
exit();
}
}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );
ここですることは、メニュー項目を追加してslugを定義してから、 'admin_init'でslugが存在するかどうかを確認して希望の場所にリダイレクトすることです。