การเพิ่ม admin-ajax.php ไปยังส่วนหน้า ความคิดที่ดีหรือไม่ดี?


17

ฉันรัก admin-ajax.php แต่ฉันเกลียดที่จะแปลเป็นภาษาท้องถิ่นเพื่อชี้สคริปต์ส่วนหน้าให้กับมันและฉันหวังว่าจะมีไฟล์ที่เทียบเท่าและหาได้ง่ายสำหรับธีม (มันก็แค่ทำให้ฉันรำคาญที่จะเห็นคำขอส่วนหน้าผ่าน "/ wp-admin /" ไม่มีเหตุผลจริงเพียงดู IMO น่าเกลียด)

ดังนั้นฉันเพียงแค่คัดลอก admin-ajax.php ไปยัง root dir ที่ "/ajax.php" ปรับเส้นทางการรวมและลบ WP_ADMIN คำจำกัดความคงที่ ดูเหมือนว่าจะทำงานเหมือนกับพวกแก๊งค์บัส (ตอนนี้ฉันสามารถส่งคำขอ AJAX ส่วนหน้าทั้งหมดของฉันไปที่ /ajax.php!

แต่จะปลอดภัยหรือไม่ มีอะไรผิดปกติ? เนื่องจากสิ่งนี้ไม่ได้อยู่ในแกนฉันคิดว่ามีเหตุผลที่ดีว่าทำไมไม่ แต่เมื่อมองดูจากรหัสฉันไม่สามารถเห็นปัญหาได้ทันที

คุณฉลาด - บอกฉันว่าวิธีนี้บ้า หรือถ้ามีวิธีที่ง่ายกว่าที่ฉันมองเห็น


คุณอาจลืมและคิดถึงไฟล์นี้ในระหว่างการอัพเดตอัตโนมัติซึ่งอาจส่งผลให้เกิดสิ่งที่แตกหักและทำให้เกิดช่องโหว่ด้านความปลอดภัย
Hemm

คำตอบ:


19

คุณสามารถใช้ RewriteRule กับ. htaccess ของคุณด้านบนกฎการเขียนลิงก์ตามปกติ:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

ตอนนี้ส่งคำขอ AJAX ของคุณไปexample.com/ajaxและไม่พลาดการเปลี่ยนแปลงหลักในไฟล์นั้นหลังจากทำการอัพเกรด


ความคิดที่ดี! มันเป็นหนึ่งในสิ่งเหล่านั้นหลังจากที่คุณได้ยินคุณคิดว่า "มันง่ายและชัดเจนมาก!" ขอบคุณ
MathSmath

ฉันได้เพิ่มกฎการเขียนexample.com/ajaxซ้ำตามข้อเสนอแนะของคุณ แต่URL 404 คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับที่.htaccessฉันควรเพิ่มภายใน ฉันมีมันระหว่าง# BEGIN WordPress <IfModule mod_rewrite.c>และ</IfModule> # END WordPress
จอห์น

วิธีนี้ใช้ได้ผล ฉันไม่มีเครื่องหมายทับ ฉันได้ตั้งค่า Permalinks เป็น /% postname% /
John

7

ครั้งแรก:มาตรฐาน หากคุณวางแผนที่จะใช้ปลั๊กอินชุมชนโอกาสที่พวกเขาจะไม่สนใจเกี่ยวกับ/ajax.phpไฟล์ของคุณในรูทเอกสาร ดังนั้นพวกเขาจะไม่ใช้มัน

หากคุณกำลังจะม้วนทุกอย่างด้วยตัวเองนี่ไม่ใช่ปัญหา

ที่สอง: จะเกิดอะไรขึ้นถ้าคอร์อัพเดต คุณจะตรวจสอบและเปลี่ยนไฟล์ ajax ของคุณหรือไม่

ที่สาม : แม้จะadmin-ajax.phpอยู่ในwp-adminนั้นก็ไม่ได้โหลดสิ่งใด ๆ ของพื้นที่ผู้ดูแลระบบ (เช่นตารางรายการ ฯลฯ ) ไม่ตรวจสอบรับรองความถูกต้องหรือเปิดเผยสิ่งที่มีความอ่อนไหวต่อผู้ใช้ที่ไม่ได้ลงชื่อเข้าใช้ มันก็เหมือนกับไฟล์ Front-End ในคำอื่น ๆ ไม่มีอะไรต้องกังวล.

ที่สี่:ที่เกี่ยวข้องกับปัญหาแรกปลั๊กอินบางตัวจะตรวจสอบก่อนที่จะโหลดฟังก์ชั่นที่เกี่ยวข้องกับอาแจ็กซ์สุ่มสี่สุ่มห้า ตัวอย่างด้านล่าง ajax.php ที่คุณแก้ไขจะไม่ทำให้โหลด

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

ในที่สุด:สิ่งที่คุณบ่นเกี่ยวกับการใช้การแปลเพื่อรับ Ajax URL เป็นสิ่งที่ดีที่จะทำ ทำไม? เนื่องจากไฟล์ JS ของคุณไม่ได้ตระหนักถึงสิ่งที่ฝั่งเซิร์ฟเวอร์ คุณกำลังจะ URL อย่างหนักที่จะทำลายถ้า / เมื่อเว็บไซต์ย้าย? ดูเหมือนจะเป็นทางเลือกที่ไม่ดี

หากคุณไม่ต้องการ จำกัด ทุกสคริปต์ที่ใช้ Ajax ให้ลองใช้งานง่ายwp_headแต่เนิ่น ๆ และแยก URL ajax ของผู้ดูแลระบบออก การแก้ไขปัญหา (นี่เป็นวิธีที่ผู้ดูแลระบบทำได้โดยวิธี)

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}

ขอบคุณคริส! คะแนนที่ถูกต้องทั้งหมด สิ่งที่ยิ่งใหญ่ที่สุดที่คุณช่วยให้ฉันรู้คือแม้ว่าฉันจะไม่คิดว่านี่เป็น "แฮ็คหลัก" (ตั้งแต่ฉันเพิ่มไม่ดัดแปลงไฟล์) มันเป็นเพราะมันขึ้นอยู่กับฟังก์ชั่นอื่น ๆ ในแกนที่อาจเปลี่ยนแปลง . ไม่แตกต่างจากปลั๊กอินอื่น ๆมากเกินไป (ซึ่งอาจตายหลังจากการเปลี่ยนแปลงในฟังก์ชันการทำงานหลัก) แต่แตกต่างกันตามหลักปรัชญาอย่างแน่นอน ขอบคุณสำหรับความคิด!
MathSmath

Re: " Third: ... ไม่ต้องกังวลอะไร " เมื่อพยายามล็อคไดเรกทอรี wp-admin เช่นใช้กฎ. htaccess เพื่อ จำกัด ช่วง IP ที่ปลอดภัยหรือไม่ ฉันเข้าใจว่ามีข้อยกเว้นบางประการที่จะต้องทำกับไฟล์ ajax-admin.php (ฉันพูดว่า "เข้าใจ" เพราะฉันเป็น numpty เมื่อพูดถึงกฎ. htaccess และไม่รู้จริงๆว่าเป็นไปได้หรือไม่)
Sepster

มันควรจะเป็นไปได้ที่จะอนุญาตให้มีไฟล์เดียวใช่
chrisguitarguy

@chrisguitarguy นี่เป็นคำตอบที่ยอดเยี่ยมขอบคุณ ฉันกำลังพยายามโหลด admin-ajax ที่ส่วนหน้าเมื่อฉันย้อนกลับ proxying siteurl ไปยัง url ของ staging / home url โปรดดูที่ลิงค์นี้เป็นไปได้ไหมที่จะใช้ปลั๊กอินของบุคคลที่สาม? วิธีการของฉันไม่ถูกต้องหรือไม่?
paranza

5

เช่นเดียวกับหลาย ๆ สิ่งใน WordPress มีวิธีมากมายในการดูแลแมว ในขณะที่วิธีการที่ยอมรับทั้งหมดใช้งานได้ฉันพบว่าพวกเขา "เรียบร้อย" น้อยกว่าการใช้wp_localize_scriptเพื่อรวมความสามารถ ajax ที่ส่วนหน้า

ลองดู:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of 
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax', 
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

จากนั้นในไฟล์ที่คุณจะอ้างอิงตัวแปรของคุณด้วยse83650.jsse83650Ajax.ajaxurl

ประโยชน์ของเทคนิคนี้คือถ้าคุณลงท้ายด้วยปลั๊กอินจำนวนมากที่ลองและทำซ้ำฟังก์ชันการทำงานนี้พวกเขาจะไม่รวมหรือเขียนทับตัวแปรเดียวกัน ajaxurlเป็นเรื่องธรรมดาที่จะรวมสิ่งนี้ทำให้คุณมีมากขึ้นและเล่นได้ดีกว่ากับนักพัฒนาคนอื่น ๆ

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