การเพิ่มลิงก์โดยพลการไปยังเมนูผู้ดูแลระบบหรือไม่


20

มีวิธีเพิ่มไฮเปอร์ลิงก์โดยพลการไปยังเมนูผู้ดูแลระบบของ WordPress หรือไม่ (ฉันหมายถึงเมนูด้านซ้ายเมื่อคุณเข้าสู่แดชบอร์ดผู้ดูแลระบบ) ตัวอย่างเช่นหนึ่งสามารถเพิ่มลิงก์ไปยัง Google?

ในกรณีของฉันโดยเฉพาะฉันต้องการเพิ่มหน้าสไตล์สำหรับธีม Wordpress ที่ฉันกำลังทำงานเพื่อให้ฉันสามารถแสดงให้ผู้ใช้เห็นว่าองค์ประกอบ HTML ที่แตกต่างกันมีสไตล์ในธีมอย่างไรและเพื่อสาธิตวิธีการสไตล์ต่างๆ

นี่คือรหัสที่ฉันมีจนถึงตอนนี้ ( หมายเหตุ: มันไม่สมบูรณ์ ): ในfunctions.phpฉันได้เพิ่มรายการเมนูใหม่ในส่วนลักษณะที่ปรากฏ :

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()ให้ข้อผิดพลาด ( ไม่สามารถแก้ไขข้อมูลส่วนหัว )

คำตอบ:


13

สวัสดี@ Tom ,

หากฉันเข้าใจคำถามของคุณถูกต้องคุณไม่จำเป็นต้องรู้วิธีเพิ่มลิงก์ไปยังเมนู (ดูเหมือนคุณรู้แล้ว) แต่ต้องเรียนรู้วิธีรับลิงก์ของคุณเพื่อเปลี่ยนเส้นทางอย่างถูกต้องใช่ไหม?

การเปลี่ยนเส้นทางไปยัง URL ภายนอกจากรายการเมนูผู้ดูแลระบบ

ถ้าอย่างนั้นสิ่งที่คุณต้องทำก็คืออย่าใช้ฟังก์ชั่นไอเท็มเมนู แต่แทนที่"ขอ" WordPress เร็วพอที่มันจะไม่ส่งผลอะไรเลยยกเว้น HTTP header เบ็ดแรกสุดเมื่อโทร/wp-admin/themes.phpจะปรากฏขึ้นafter_setup_themeและดูเหมือนว่าจะทำงานได้ดี

ใช้"บุ้งเมนู"เพื่อให้คุณสามารถทดสอบมันในตะขอ

แต่เพื่อให้มันทำงานเราต้องแก้ไขการโทรของคุณadd_theme_pageเป็นadmin_menuhook / create_theme_style_page()function ของคุณก่อน เราลดลงพารามิเตอร์ห้า (ฟังก์ชั่นที่จะเรียกตัวเลือกที่จะใช้ผู้ดูแลระบบ) เพราะเราไม่จำเป็นต้องใช้และเปลี่ยนพารามิเตอร์ที่สี่ (คนเมนู "กระสุน" ) themes.php?goto=build-styleguide-pageจะเป็น

แม้ว่าเราจะสามารถเลือกได้เกือบทุกอย่างสำหรับพารามิเตอร์ตัวที่สี่เนื่องจากเราจะเปลี่ยนเส้นทางฉันไปที่หน้าเดียวกัน ( themes.php) เป็นตัวเลือกลักษณะอื่น ๆ เพื่อความมั่นคง ฉันเพิ่งสร้างชื่อขึ้นมาเองโดยพลการgotoเพราะ WordPress ไม่ได้ใช้และดูเหมือนว่าเหมาะสมสำหรับเรื่องนี้

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'
  );
}

BTW เรากำจัดbuild_styleguide_page()ฟังก์ชั่นของคุณเพราะเราไม่ต้องการมันสำหรับโซลูชันนี้

เปลี่ยนเส้นทางใน Hook แรกสุดสำหรับthemes.php:after_setup_theme

ในฐานะที่เป็นรหัสสุดท้ายของเราเราใช้after_setup_themeเบ็ดของเราในredirect_from_admin_menu()ฟังก์ชั่นของเรา เรามีการทดสอบเพื่อดูว่าหน้าปัจจุบัน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;
  }
}

หมายเหตุ:

  1. ฉันเลือกที่จะใช้คำสั่งswitch/ caseในafter_setup_themehook / redirect_from_admin_menu()ฟังก์ชั่นเพื่อที่จะเพิ่มการgotoเปลี่ยนเส้นทางเพิ่มเติมได้ง่ายขึ้นถ้าคุณต้องการ เพียงเพิ่มคำสั่งกรณีเพิ่มเติม

  2. wp_redirect()และwp_safe_redirect()ฟังก์ชั่นไม่จริงยุติ; คุณต้องออกคำสั่ง exit อย่างชัดเจนเพื่อให้ WordPress หยุดและไม่แทนที่การเปลี่ยนเส้นทางของคุณ

หวังว่านี่จะช่วยได้!


22

หากคุณเพิ่มรายการลงในเมนูโดยเพิ่มลงใน$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แสดงถึงคีย์ / ลิงค์ของเมนูพาเรนต์ดังนั้นในตัวอย่างโดยทั่วไปแล้วฉันเพิ่มรายการลงในเมนูแดชบอร์ด

แน่นอนว่ามันไม่ได้สวยเท่าการใช้งานadd_{type}_pageฟังก์ชั่น แต่มันแก้ปัญหาในความเป็นจริง WordPress ป้องกัน URL นอกไซต์ในลิงก์เมนูผู้ดูแล

ฉันใช้สิ่งที่คล้ายกันเพื่อเพิ่มโฮสต์เสมือนต่างๆของฉันลงในเมนูดังนั้นฉันสามารถสลับไปยังการติดตั้งอื่น ๆ ได้โดยตรงจากเมนูผู้ดูแลระบบ (ทุกอย่างทำด้วยสคริปต์

หมายเหตุ:หากคุณตัดสินใจที่จะใช้รหัสโปรดใช้ความระมัดระวังไม่ให้กำหนดรหัสที่ใช้งานอยู่ (รหัส 500 แถวในรหัสตัวอย่าง)

เคล็ดลับ:คุณสามารถใช้ค่าลบในปุ่มเมนูได้เพื่อให้คุณสามารถบังคับให้รายการเมนูของคุณนั่งอยู่ข้างหน้ารายการ WordPress ดั้งเดิม


หมายเหตุ:ฉันคิดว่าคุณจะต้องตั้งค่าคีย์ลบนั้นเป็นสตริงเช่น '-5'และไม่-5อื่นถือว่าเป็นกุญแจสำคัญที่ไม่ถูกต้อง (ฉันคิดว่า) .. (สตริงลบใช้งานได้แม้ว่าถ้าฉันไม่ได้เข้าใจผิด) ..
t31os

ขอบคุณ, แย่มากที่คุณไม่สามารถทำได้ด้วยฟังก์ชั่นจริง ๆ , แต่มันดีกว่าการเพิ่มคำสั่ง hook / redirect combo เพียงแค่มีลิงค์
El Yobo

2
คำตอบเฉพาะนี้ช่วยฉันด้วยปลั๊กอินรายการเมนูสถานะการโพสต์ (คุณอาจเดาได้ว่ามันทำอะไร) อย่างไรก็ตามเนื่องจากฉันไม่ทราบว่ามีปลั๊กอินอื่นใดบ้างที่จะเพิ่มเนื้อหาลงในเมนูใดฉันคิดว่าฉันแค่เพิ่มว่าเคยใช้array_push()ผนวกรายการเมนูเพื่อหลีกเลี่ยงการชนกับปลั๊กอินอื่น ๆ
mrwweb

ใช้งานได้อย่างมีเสน่ห์บวกกับคะแนนโบนัสสำหรับการใช้ตัวอย่างขนาดเล็ก
João

2
+1 แทนที่จะหยิบกุญแจและหวังเพียงแค่หยิบกุญแจดอกสุดท้ายและเพิ่มขึ้น ตัวอย่างเช่นเมื่อเพิ่มรายการเมนูย่อยในเมนูเครื่องมือ: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = ฯลฯ
webaware

3

ฉันประสบความสำเร็จเช่นนี้:

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 );

สิ่งที่คุณทำที่นี่คือคุณเพิ่มรายการเมนูและกำหนดกระสุนจากนั้นใน 'admin_init' คุณตรวจสอบว่ามีกระสุนอยู่หรือไม่และเปลี่ยนเส้นทางไปยังตำแหน่งที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.