คุณจะตรวจสอบว่าคุณอยู่ในหน้าใดหน้าหนึ่งในส่วน WP Admin ได้อย่างไร? ตัวอย่างเช่นฉันจะตรวจสอบได้อย่างไรว่าฉันอยู่ในหน้าผู้ใช้> โปรไฟล์ของคุณหรือไม่


32

ฉันกำลังสร้างปลั๊กอินและฉันต้องการเพิ่มบิตของจาวาสคริปต์ในส่วนหัวของผู้ดูแลระบบ แต่สำหรับหน้าผู้ดูแลระบบบางหน้าเท่านั้น ฉันไม่ได้หมายถึงหน้าเว็บในหน้า WordPress ที่คุณสร้างขึ้นเอง แต่เป็นหน้าของผู้ดูแลระบบที่มีอยู่เช่น 'โปรไฟล์ของคุณ', 'ผู้ใช้' ฯลฯ มีฟังก์ชั่น wp สำหรับงานนี้โดยเฉพาะหรือไม่? ฉันค้นหามาแล้วและฉันสามารถหาฟังก์ชั่นบูลีนis_adminและแอ็คชัน hooks เท่านั้น แต่ไม่ใช่ฟังก์ชั่นบูลีนที่เพิ่งตรวจสอบ


1
เขยิบเบา ๆ เพื่อเตือนให้คุณคำตอบยังไม่ได้รับการยอมรับ หากไม่มีคำตอบใดที่ตอบคำถามของคุณอย่างเพียงพอหรือคุณกำลังดิ้นรนเพื่อทำความเข้าใจข้อมูลที่ให้ไว้โปรดแสดงความคิดเห็นเพื่อแจ้งให้เราทราบ
t31os

คำตอบ:


24

วิธีการทำเช่นนี้คือการใช้ขอ 'admin_enqueue_scripts' เพื่อจัดคิวไฟล์ที่คุณต้องการ เบ็ดนี้จะถูกส่งผ่าน $ hook_suffix ที่เกี่ยวข้องกับหน้าปัจจุบันที่โหลด:

function my_admin_enqueue($hook_suffix) {
    if($hook_suffix == 'appearance_page_theme-options') {
        wp_enqueue_script('my-theme-settings', get_template_directory_uri() . '/js/theme-settings.js', array('jquery'));
        wp_enqueue_style('my-theme-settings', get_template_directory_uri() . '/styles/theme-settings.css');
        ?>
        <script type="text/javascript">
        //<![CDATA[
        var template_directory = '<?php echo get_template_directory_uri() ?>';
        //]]>
        </script>
        <?php
    }
}
add_action('admin_enqueue_scripts', 'my_admin_enqueue');

55

มีตัวแปรทั่วโลกใน wp-admin ที่เรียกว่า$ pagenowซึ่งเก็บชื่อของหน้าปัจจุบันเช่น edit.php, post.php เป็นต้น

คุณสามารถตรวจสอบคำขอ $ _GET เพื่อ จำกัด ตำแหน่งของคุณให้แคบลงได้อีกตัวอย่างเช่น:

global $pagenow;
if (( $pagenow == 'post.php' ) && ($_GET['post_type'] == 'page')) {

    // editing a page

    }

if ($pagenow == 'users.php') {

    // user listing page

    }

if ($pagenow == 'profile.php') {

    // editing user profile page

    }

1
global $pagenow; if ( ( 'admin.php' === $pagenow ) && ( 'prefix-theme-settings' === $_GET['page'] ) ) { logic.. }admin.php?page=prefix-theme-settingsสำหรับการตรวจสอบตัวอย่างเช่นถ้าคุณอยู่ในหน้าธีมที่กำหนดเองการตั้งค่า
lowtechsun

19

มีการget_current_screenเพิ่มวิธีการที่ครอบคลุมที่สุดใน WordPress 3.1

$screen = get_current_screen();

ผลตอบแทน

WP_Screen Object (
    [action] => 
    [base] => post
    [id] => post
    [is_network] => 
    [is_user] => 
    [parent_base] => edit
    [parent_file] => edit.php
    [post_type] => post
    [taxonomy] => 
)

3
"ข้อ จำกัด การใช้งาน - ฟังก์ชั่นนี้มีการกำหนดไว้ในหน้าผู้ดูแลระบบส่วนใหญ่ แต่ไม่ใช่ทั้งหมดดังนั้นจึงมีบางกรณีที่ is_admin () จะคืนค่าจริง แต่การพยายามเรียกใช้ get_current_screen () จะทำให้เกิดข้อผิดพลาดร้ายแรงเนื่องจากไม่ได้กำหนดไว้ ตัวอย่างที่รู้จักกันคือ wp-admin / Customize.php ฟังก์ชั่นส่งคืน null ถ้าเรียกว่าจาก admin_init เบ็ดมันควรจะตกลงที่จะใช้ในเบ็ดในภายหลังเช่น current_screen "- Codex
Guy บราซิลนั่น

@ThatBrazilianGuy การตรวจสอบอย่างรวดเร็วชี้ให้เห็นว่านี่ไม่ใช่กรณีอีกต่อไปเท่าที่ฉันเห็นว่าget_current_screen()มีความปลอดภัยในการใช้งานในหน้าผู้ดูแลระบบทั้งหมด
Shahar

1
@shahar ยังคงเป็นกรณีนี้ตามเอกสารเชื่อมโยงข้างต้นและประสบการณ์ของฉัน
fabrik

9

เสนอวิธีการ / แนวทางอื่นในคำถามข้างต้น

// When you are viewing the users list or your editing another user's profile
add_action( 'admin_print_scripts-users.php', 'your_enqueue_callback' );

// When you are editing your own profile
add_action( 'admin_print_scripts-profile.php', 'your_enqueue_callback' );

function your_enqueue_callback() {
    wp_enqueue_script( .. YOUR ENQUEUE ARGS .. );
}

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


หวังว่าฉันจะรู้ว่าทำไมคำตอบนี้ไม่ได้รับการโหวตมากขึ้นครอบคลุมกรณีการใช้งานที่แน่นอนในคำถามและให้การแก้ปัญหาในรหัสที่น้อยที่สุด ข้อเสนอแนะน่าจะดี ..
t31os

3

ฉันคิดว่ามันแปลกที่ไม่มีใครพูดถึงความจริงที่ว่าฟังก์ชั่น add_menu_page ส่งคืน hook action ซึ่งคุณสามารถใช้เพื่อดำเนินการบางอย่างกับเพจเหล่านั้นเท่านั้น

$hook = add_menu_page($menu_title, $page_title, $capability, $slug, $function, $icon_url, $position);
add_action( 'load-' . $hook, 'my_admin_enqueue_scripts' );
function my_admin_enqueue_scripts() {
    wp_enqueue_script(/*...*/);
    wp_enqueue_style(/*...*/);
}

หากคุณต้องการ $ hook และคุณไม่ได้เพิ่มหน้าเมนูด้วยตัวคุณเองเอกสารอยู่ที่นี่

เช่นเบ็ดสำหรับหน้าเมนูระดับบนสุดคือ

โหลด toplevel_page_ $ MenuSlug

hook สำหรับหน้าเมนูย่อยคือ

load- $ MenuSlug_page_ $ SubMenuSlug

ตามตรรกะนั้นตะขอสำหรับหน้าโปรไฟล์ของผู้ใช้คือ

โหลด users_page_profile

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