Thêm admin-ajax.php vào frontend. Ý tưởng tốt hay xấu?


17

Tôi yêu admin-ajax.php. Nhưng tôi ghét phải bản địa hóa để trỏ các tập lệnh frontend vào nó và tôi ước có một tệp tương đương, dễ tìm cho các chủ đề. (Nó cũng làm phiền tôi khi thấy các yêu cầu frontend đi qua "/ wp-admin /". Không có lý do thực tế, chỉ trông IMO xấu xí.)

Vì vậy, tôi chỉ đơn giản là sao chép admin-ajax.php vào thư mục gốc tại "/ajax.php", điều chỉnh các đường dẫn bao gồm và xóa định nghĩa hằng số WP_ADMIN. Có vẻ như hoạt động như các băng nhóm (bây giờ tôi có thể chỉ đạo tất cả các yêu cầu AJAX ngoại vi của mình đến /ajax.php! Và tôi vẫn có thể sử dụng các móc wp_ajax bình thường trong các plugin của mình!).

Nhưng điều này có an toàn không? Điều gì có thể đi sai? Vì điều này không được tích hợp vào cốt lõi, tôi cho rằng có một lý do chính đáng là tại sao không. Nhưng nhìn qua mã, tôi không thể thấy bất kỳ vấn đề nào ngay lập tức.

Bạn thông minh - hãy nói cho tôi biết nếu cách tiếp cận này là điên rồ. Hoặc nếu có một phương pháp đơn giản hơn mà tôi đang xem.


Bạn có thể quên và bỏ lỡ tệp này trong quá trình cập nhật tự động, điều này có thể dẫn đến những thứ bị phá vỡ và để lại lỗ hổng bảo mật.
Hemm

Câu trả lời:


19

Bạn chỉ có thể sử dụng RewriteRule cho .htaccess của bạn trên các quy tắc viết lại permalink thông thường:

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

Bây giờ hãy gửi các yêu cầu AJAX của bạn tới example.com/ajaxvà không bao giờ bỏ lỡ các thay đổi cốt lõi đối với tệp đó sau khi nâng cấp.


Ý tưởng tuyệt vời! Đó là một trong những điều mà sau khi bạn nghe nó, bạn nghĩ rằng "điều đó thật đơn giản và rõ ràng!" Cảm ơn.
MathSmath

Tôi đã thêm quy tắc viết lại theo đề xuất của bạn nhưng example.com/ajaxURL 404. Bạn có thể giải thích chính xác về nơi .htaccesstôi nên thêm cái này vào. Tôi có nó hiện tại giữa # BEGIN WordPress <IfModule mod_rewrite.c></IfModule> # END WordPress
John

Những công việc này. Tôi đã bỏ lỡ dấu gạch chéo. Tôi có permalinks được đặt thành /% postname% /
John

7

Thứ nhất: tiêu chuẩn hóa. Nếu bạn có kế hoạch sử dụng các plugin cộng đồng, rất có thể họ sẽ không quan tâm đến /ajax.phptệp của bạn trong thư mục gốc. Vì vậy, họ sẽ không sử dụng nó.

Nếu bạn sẽ tự mình tung mọi thứ, đây không phải là vấn đề.

Thứ hai: nếu cập nhật cốt lõi thì sao? Bạn sẽ theo dõi và thay đổi tập tin ajax của bạn?

Thứ ba : mặc dù admin-ajax.phpcư trú wp-admin, nó không tải bất kỳ nội dung nào trong khu vực quản trị (ví dụ: bảng danh sách, v.v.). Nó cũng không kiểm tra auth hoặc phơi bày bất cứ điều gì nhạy cảm với người dùng không đăng nhập. Nói cách khác, nó giống như một tập tin mặt trước. Không có gì phải lo lắng về.

Thứ tư: Liên quan đến vấn đề đầu tiên, một số plugin sẽ kiểm tra trước khi tải một cách mù quáng chức năng liên quan đến ajax. Một ví dụ dưới đây. Ajax.php đã sửa đổi của bạn có thể sẽ không khiến điều đó được tải.

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

Cuối cùng: Những gì bạn phàn nàn, sử dụng bản địa hóa để lấy URL Ajax là một việc nên làm. Tại sao? Bởi vì các tệp JS của bạn không biết bất kỳ nội dung nào của máy chủ. Bạn sẽ làm khó một URL trong đó sẽ bị hỏng nếu / khi trang web di chuyển? Có vẻ như là một lựa chọn tồi.

Nếu bạn thực sự không muốn bản địa hóa mọi tập lệnh sử dụng Ajax, hãy nối đơn giản vào wp_headthực sự sớm và nhổ URL ajax của quản trị viên. Vấn đề đã được giải quyết (đây chính xác là cách khu vực quản trị thực hiện nó).

<?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
}

Cảm ơn, Chris! Tất cả các điểm hợp lệ. Điều lớn nhất mà bạn đã giúp tôi nhận ra là, mặc dù tôi không nghĩ đây là "hack lõi" (vì tôi đã thêm, không sửa đổi tệp), nhưng thực sự là do nó phụ thuộc vào chức năng khác trong lõi có thể thay đổi . Không quá khác biệt so với bất kỳ plugin nào khác (cũng có thể chết sau khi thay đổi chức năng cốt lõi), nhưng chắc chắn là khác biệt về mặt triết học. Cảm ơn những suy nghĩ!
MathSmath

Re: " Thứ ba: ... Không có gì phải lo lắng. ", Còn khi cố gắng khóa thư mục wp-admin, ví dụ: sử dụng quy tắc .htaccess để giới hạn phạm vi IP an toàn đã biết thì sao? Tôi đoán một số loại ngoại lệ sẽ cần phải được thực hiện cho tệp ajax-admin.php? (Tôi nói "giả định" bởi vì tôi là một người lập dị khi nói đến các quy tắc .htaccess và không thực sự biết nếu điều này là có thể?).
Sepster

Có thể cho phép một tập tin duy nhất, vâng.
chrisguitarguy

@chrisguitarguy đây là một câu trả lời tuyệt vời, cảm ơn bạn. Tôi đang cố gắng để admin-ajax được tải ở giao diện người dùng vì tôi đang ủy quyền ngược lại trang web với url dàn / nhà của tôi. Vui lòng xem tại đây: link Có thể làm điều đó với plugin của bên thứ 3 không? Là cách tiếp cận của tôi không chính xác?
paranza

5

Như với nhiều thứ trong WordPress, có vô số cách để lột da mèo. Mặc dù tất cả các phương thức được chấp nhận đều hoạt động, tôi đã thấy rằng chúng ít "gọn gàng" hơn so với sử dụng wp_localize_script để bao gồm khả năng ajax ở mặt trước.

Kiểm tra này:

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

Và sau đó trong se83650.jstệp, bạn sẽ tham chiếu biến của mình với se83650Ajax.ajaxurl.

Lợi ích của kỹ thuật này là nếu bạn kết thúc với nhiều plugin thử và sao chép chức năng này, chúng sẽ không bao gồm hoặc ghi đè lên cùng một biến. ajaxurllà khá chung chung để bao gồm, điều này giúp bạn có nhiều hơn và nó chơi đẹp hơn với các nhà phát triển khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.