ฉันจะจัดการกับการกระทำของหน้าปลั๊กอินที่กำหนดเองได้ดีที่สุดได้อย่างไร


21

ฉันทำงานอย่างต่อเนื่องกับความรำคาญแบบเดียวกันดังนั้นฉันคิดว่าฉันจะดูว่ามีความคิดหรือประสบการณ์ที่นั่น ...

ฉันสร้างปลั๊กอินที่ใช้หน้าผู้ดูแลระบบของตัวเองแล้ว มันมีการ ตอนนี้ฉันแยกแยะเนื้อหา WP_List_Table () ฉันต้องบอกว่ามันยอดเยี่ยม ... แต่ ....

หน้าปลั๊กอินแบบกำหนดเองจะโหลดเสมอadmin.php?page=...เว้นแต่ว่าฉันต้องการโหลดจากไดเรกทอรีปลั๊กอินโดยตรงซึ่งฉันไม่ต้องการ ตอนนี้ถ้าฉันทำ 'การกระทำ' จากหน้านั้นฉันต้องดำเนินการอย่างใดแล้วเปลี่ยนเส้นทางกลับไปที่หน้าโดยไม่ต้องพารามิเตอร์การกระทำ ไม่ว่าฉันจะทำ GET หรือ POST จริงๆ

ในทุกหน้าเป็นภายใน WP ทำสิ่งนี้ในหน้าเดียวกันตรวจสอบว่ามีการกระทำหรือไม่ถ้าเป็นเช่นนั้นประมวลผลแล้วเปลี่ยนเส้นทางไปยังตัวเองโดยไม่ต้องดำเนินการ สิ่งนี้เป็นไปได้เพราะในหน้าเหล่านี้admin-headerยังไม่ได้โหลด

หากคุณลองทำบนหน้าของคุณเองครึ่งหนึ่งของอินเทอร์เฟซผู้ดูแลระบบได้ถูกส่งไปยังเบราว์เซอร์แล้วดังนั้นจึงไม่สามารถเปลี่ยนเส้นทางได้อีกต่อไป เห็นได้ชัดว่าวิธีแก้ปัญหาคือ POST / GET โดยตรงไปยังหน้าอื่นโหลดเฟรมเวิร์ก WP ที่ทำการประมวลผลแล้วเปลี่ยนเส้นทางกลับไปที่หน้าเดิม ... แต่ ... ที่น่ารำคาญเล็กน้อยเพราะ ... เดิมของฉัน โหลดหน้าเว็บด้วยการโทรกลับเพื่อให้ทำงานในวิธีการเรียนของฉัน นั่นเป็นสิ่งที่สวยงาม

หากฉันโหลดหน้าแยกฉันต้องรวมด้วยตนเองwp-load.phpและฉันอยู่นอกชั้นเรียนของฉันซึ่งเป็นที่น่ารำคาญและในกรณีของฉันโดยเฉพาะอย่างยิ่งฉันข้อผิดพลาดโดยเฉพาะอย่างยิ่งเพราะฉันเพียง instanciating ชั้นปลั๊กอินของฉันโดยไม่ระบุชื่อ จากด้านนอก.

ดังนั้นหลังจากเรื่องยาวนี้ ... ไม่มีใครคิดวิธีแก้ปัญหาที่ดีในการโหลดอีกหน้าผ่านการติดต่อกลับ โดยไม่ต้องมีส่วนต่อประสานผู้ดูแลระบบทั้งหมดที่ติดตั้งไว้แล้ว?

(ฉันรู้วิธีแก้ปัญหา ... ฉันสามารถขอฟังก์ชั่นเข้า load-....ที่จะตรวจสอบพารามิเตอร์การกระทำและทำการประมวลผลและเปลี่ยนเส้นทาง แต่ฉันสงสัยว่ามีวิธีที่ดีกว่านี้หรือไม่)

ขอบคุณ


ทำไมนี้จะติดแท็กด้วย[plugin-wp-pagenavi]? [plugin-development]ยินดีต้อนรับอย่างแน่นอนที่นี่
Jan Fabry

@Jan Fabry: ไม่แน่ใจว่าplugin-wp-pagenaviมีไว้เพื่ออะไร... ฉันคิดว่ามันเกี่ยวกับความสัมพันธ์ระหว่างปลั๊กอินและเมนูผู้ดูแลระบบ เนื่องจากคำถามของฉันเกี่ยวข้องกับสิ่งนั้นฉันจึงเลือกแท็กนั้น
wyrfel

WP-PageNaviเป็นปลั๊กอินที่มีการนำทางเพจขั้นสูงสำหรับ front-end คุณสามารถใช้[admin-menu]ที่นี่ แต่ฉันไม่คิดว่ามันเกี่ยวข้องกับสิ่งนั้นจริงๆ ฉันเปลี่ยนแท็กเป็นสิ่งที่ฉันคิดว่าเหมาะกับคุณแน่นอนคุณสามารถแก้ไขได้อีกครั้ง
Jan Fabry

@Jan Fabry: ขอบคุณสำหรับการติดแท็กอีกครั้ง ... ยังไม่คุ้นเคยกับแท็กพูลทั้งหมด แต่ (ค่อนข้างชัดเจน)
wyrfel

คำตอบ:


28

ตามกฎทั่วไปคุณควรใช้คำขอ POST สำหรับการกระทำส่วนใหญ่เพื่อให้แน่ใจว่าไม่ใช่ ดำเนินการโดยอุบัติเหตุ แต่ก็เป็นแนวปฏิบัติที่ดีในการเปลี่ยนเส้นทางไปยังหน้าปกติหลังจากคำขอ POST เพื่อป้องกันการเรียกใช้ซ้ำเมื่อผู้ใช้รีเฟรชหน้า

ดังนั้นการไหลจึงเป็นเช่นนี้

  1. หน้าปลั๊กอินของคุณด้วยแบบฟอร์ม POST ซึ่งส่งไป
  2. หน้าเว็บที่จัดการคำขอซึ่งเปลี่ยนเส้นทางไป
  3. หน้าปลั๊กอินของคุณซึ่งแสดงผลลัพธ์ของการดำเนินการ

หน้ากลางไม่จำเป็นต้องเป็นหน้าปลั๊กอินของคุณ ซึ่งหมายความว่าคุณสามารถใช้"ทั่วไป POST จัดการ"ที่รวมสามปีที่ผ่านมาเบ็ดใน'admin_action_' . $_REQUEST['action']admin.phpเบ็ดใน

ผู้ใช้ตัวอย่างเช่นปลั๊กอิน Akismet หากคุณต้องการใช้อย่างน่าเชื่อถือคุณต้องส่งไปยังadmin.phpโดยตรงไม่ใช่ไปยังหน้าอื่นที่รวมอยู่ด้วยadmin.phpอยู่ด้วย

นี่เป็นตัวอย่างพื้นฐานของการใช้งาน:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}

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

@wyrfel: ใช่การโทรadmin.phpโดยตรงคือ "เคล็ดลับ" ที่แหล่ง Akismet สอนฉัน คุณถูกต้องเมื่อคุณแสดงฟอร์มและต้องการแสดงอีกครั้งในกรณีที่มีข้อผิดพลาด: ถ้าปลายทางเป็นหน้าปลั๊กอินของคุณ แต่ตะขออยู่ตรงจุดเริ่มต้น (เพื่อให้คุณสามารถเปลี่ยนเส้นทางหากประสบความสำเร็จหรือแสดง แบบฟอร์มอีกครั้งด้วยข้อความข้อผิดพลาดถ้าไม่) อาจจะแนะนำในตั๋ว Trac?
Jan Fabry

ฉันจะยื่นตั๋ว ในฐานะที่เป็นวิธีแก้ปัญหาฉันพบว่า'load-<pagehook>'เบ็ดในการทำงาน ... มันถูกเรียกก่อนที่จะโหลดหน้าเว็บ ... แต่admin_action_...แนวคิดดูเหมือนจะดีขึ้นมากและเฉพาะเจาะจงมากขึ้น นอกจากนี้ในบันทึกย่อข้อความแสดงข้อผิดพลาดยังคงมีปัญหาหากคุณทำ POST และไม่ต้องการ repost ในการโหลดซ้ำ แต่นั่นเป็นหัวข้ออื่น
wyrfel

@wyrfel: ทำไมข้อความแสดงข้อผิดพลาดยังคงเป็นปัญหาอยู่ หากมีข้อความแสดงข้อผิดพลาดให้อยู่ในหน้านั้นและแสดงแบบฟอร์มอีกครั้งพร้อมข้อความ (แน่นอนว่าการรีเฟรชจะไม่สมเหตุสมผลมากที่นี่ - แต่มันจะไม่เป็นอันตรายเพราะข้อผิดพลาดจะยังอยู่ที่นั่นและจะไม่มีการดำเนินการใด ๆ ถูกประหารชีวิต) หากไม่มีข้อผิดพลาดให้ดำเนินการและเปลี่ยนเส้นทางไปยังหน้าภาพรวม "ปลอดภัย" สิ่งนี้จะใช้งานได้ - หากadmin_action_ตะขอจะถูกย้ายก่อนหน้าตัวโหลดปลั๊กอิน
Jan Fabry

ตกลง ... ฉันคิดว่าซับซ้อนเกินไป
wyrfel

3

ฉันเข้าหาสิ่งนี้แตกต่างกันเล็กน้อยโดยเพิ่ม noheader = true ให้กับ url การกระทำบนหน้าเว็บที่ผู้ใช้ส่งการกระทำ

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

วิธีการนี้ช่วยให้การดำเนินการทั้งหมด: รายการเพิ่มแก้ไขลบจำนวนมากลบ ฯลฯ ในชั้นเรียนเดียวกันและมีทากผู้ดูแลระบบเดียวกันจึงง่ายต่อการบำรุงรักษาและเข้าใจ


ผู้ชายคุณเป็นอัจฉริยะ! ฉันดิ้นรนมาสองวันแล้วและสิ่งที่ฉันต้องการก็คือส่วน "noheader = true" ขอบคุณ!
r00m

0

อีกวิธีที่แตกต่างกันเพียงแค่เพิ่มฟิลด์อินพุตที่ซ่อนอยู่ในแบบฟอร์ม:

<input type="hidden" name="page" value="your-page-slug" />

ด้วยวิธีนี้ WordPress ดูเหมือนจะจัดการการเปลี่ยนเส้นทางโดยอัตโนมัติ

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