Làm thế nào để bao gồm wp-load.php từ bất kỳ vị trí nào?


10

Tôi có một plugin gọi một tập lệnh php độc lập (myAjax.php) thông qua tập lệnh jQuery.ajax () bên trong plugin.

Tôi cần đặt đoạn mã sau vào tệp myAjax.php:

require_once('../../../wp-load.php');

if (!is_user_logged_in()){
    die("You Must Be Logged In to Access This");
}
if( ! current_user_can('edit_files')) {
    die("Sorry you are not authorized to access this file");
}

Tuy nhiên, tôi muốn một phương pháp chống đạn hơn để chỉ định đường dẫn đến wp-load.php trong trường hợp đường dẫn tương đối thực tế khác với ví dụ của tôi.



Để thêm vào những gì Milo nói, đây là 2 bài viết tuyệt vời về chủ đề này. garyc40.com/2010/03/5-tips-for-USE-ajax-in-wordpress ( phiên bản cuối ) ottopress.com/2010/dont-include-wp-load-please ( phiên bản cuối ) Cũng vì mục đích học tập , trình chiếu đầu tiên andrewnacin.com/2011/04/16/wordcamp-seatussy ( phiên bản cuối cùng )
Wyck

Câu trả lời:


5

Bạn có thể sử dụng __DIR__liên tục. Vì tệp nằm trong plugin hoặc thư mục chủ đề, luôn nằm trong wp-contentthư mục .. Bạn chỉ cần lấy đường dẫn của tệp và cắt mọi thứ bắt đầu wp-contenttừ đó:

$path = preg_replace('/wp-content.*$/','',__DIR__);

Nếu bạn cần chắc chắn rằng wp không nằm trong một số thư mục nội dung wp (ai biết được? Có chuyện gì xảy ra) - hãy sử dụng cái nhìn tiêu cực:

$path = preg_replace('/wp-content(?!.*wp-content).*/','',__DIR__);

(vì dễ dàng hơn để chắc chắn rằng plugin của riêng bạn mà bạn đang phát triển không nằm trong một số thư mục nội dung wp khác)

Aaand .. của bạn wp-loadlà có:

include($path.'wp-load.php');

Nhưng!

Như các bạn đã đề cập trước đây, đối với AJAX, bạn có thể sử dụng kỹ thuật ajax riêng của WP-s .

Tất nhiên, có những trường hợp khi kỹ thuật AJAX nguyên gốc của WP là không đủ.


3
wp-contentcó thể vắng mặt hoặc trong một thư mục hoàn toàn khác với WP.
fuxia

Đây có lẽ là cách tốt nhất. Nếu bạn có một vị trí nội dung wp kỳ lạ (không chắc) chỉ cần điều chỉnh regex của bạn.
pguardiario

0

Tôi biết đây là một câu hỏi cũ nhưng muốn thêm câu trả lời của riêng tôi mà tôi nghĩ có thể giúp một số người dùng cố gắng đạt được điều tương tự.

Đúng, luôn luôn tốt hơn (và dễ dàng hơn) để sử dụng API WP Ajax gốc, nhưng nó có thể trở nên rất chậm vì nó tải toàn bộ cá thể WP.

Giải pháp của tôi: khá đơn giản và nên hoạt động để lấy rootcài đặt wordpress. Trong bất kỳ tập lệnh nào bạn đang thực hiện cuộc gọi AJAX tùy chỉnh, chỉ cần đảm bảo rằng trước tiên bạn đăng ký tập lệnh với wp_register_script()(chưa thực hiện nó). Sau đó sử dụng wp_localize_script()và phân tích cú pháp ABSPATH(đây là một hằng số được xác định bên trong wp-load.phpvà sẽ giữ đường dẫn gốc). Bây giờ bạn có thể truy xuất tệp này trong tập lệnh của mình và phân tích cú pháp cùng với lệnh gọi AJAX. Cuối cùng tất nhiên hãy chắc chắn để thực sự mê hoặc kịch bản với wp_enqueue_script().

Thí dụ:

Đoạn mã PHP dưới đây sẽ liệt kê script.jstệp của bạn và cho phép bạn truy xuất rootthư mục bằng cách gọi pluginslug_scriptname_i18n.wp_root. Về cơ bản, wp_localize_script()được sử dụng để thực hiện các bản dịch, nhưng điều này cũng trở nên hữu ích để phân tích dữ liệu vào (các) tập lệnh mà bạn đã truy xuất phía máy chủ.

        $handle = 'pluginslug-scriptname'; // Set script handle
        $name = str_replace( '-', '_', $handle ) . '_i18n'; // Will convert handle to pluginslug_scriptname_i18n
        wp_register_script( $handle, plugin_dir_url( __FILE__ ) . 'script.js', array(), '1.0.0', false );  
        wp_localize_script(
            $handle,
            $name,
            array( 
                'ajax_url' => plugin_dir_url( __FILE__ ) . 'ajax-handler.php', // @THIS WILL HOLD YOUR AJAX URL :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.ajax_url
                'wp_root' => ABSPATH // @THIS WILL HOLD THE ROOT PATH :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.wp_root
            )
        );
        wp_enqueue_script( $handle );

Bạn script.jscó thể trông như thế này:

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 ){
            if (this.status == 200) {
                // Success:
            }
            // Complete:
        }
    };
    xhttp.onerror = function () {
      console.log(this);
      console.log("** An error occurred during the transaction");
    };
    xhttp.open("POST", pluginslug_scriptname_i18n.ajax_url, true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
    var params = JSON.stringify({
        first_name: 'Johny',
        wp_root: pluginslug_scriptname_i18n.wp_root
    });
    xhttp.send(params);

Bây giờ bên trong ajax-handler.phpbạn có thể lấy wp_content_dirvà tải wp-load.phpnhư thế:

// Set proper content type
header('Content-Type: text/html');
// Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');
// Get's the payload
$request_body = json_decode( file_get_contents('php://input'), true );  

// Set this to true to just load the basics!
// Only set this to true if you know what you are doing
// Lookup SHORTINIT inside wp-settings.php for more details
define( 'SHORTINIT', false ); 

// Include wp-load.php
require_once( $request_body['wp_root'] . 'wp-load.php' );
die();

Xin lưu ý rằng wp_rootphía khách hàng có thể được thay đổi.

Như một lưu ý phụ:

Một mẹo khác mà một số bạn có thể không biết là trước khi bao gồm wp-load.phpbạn có thể định nghĩa một hằng số được gọi là SHORTINIT(boolean). Điều này sẽ bảo WordPress chỉ tải những điều cơ bản (có nghĩa là bạn sẽ mất rất nhiều chức năng cốt lõi của WP) nhưng nó sẽ tăng tốc thời gian tải vì nó sẽ không bao gồm tất cả các tệp cần thiết cho một phiên bản WP thông thường. Cái SHORTINITđược xác định bên trong wp-settings.php(chỉ cần mở tệp và tìm kiếm SHORTINIT. Bạn sẽ hiểu rõ hơn về những gì đang xảy ra dưới mui xe. Thủ thuật tiện lợi này sẽ tăng tốc độ tải xuống nhiều hơn (tới 75% trong các thử nghiệm của tôi mà tôi đã làm cách đây một thời gian). Nhưng điều này sẽ phụ thuộc vào phiên bản WP. Ngoài ra, hãy nhớ rằng những wp-load.phpthay đổi thường xuyên với các phiên bản WP mới, vì vậy nếu bạn sử dụngSHORTINIThãy chắc chắn rằng tập lệnh của bạn sẽ luôn hoạt động ngay cả trong các phiên bản WordPress trong tương lai và cả với phiên bản thấp hơn của WordPress. Nói tóm lại, nếu bạn làm những việc phức tạp dựa vào rất nhiều bộ mã WordPress, thì hãy đảm bảo KHÔNG đặt SHORTINITthành đúng .


-1

Bạn có thể sử dụng mã dưới đây để sử dụng wp-load.php để bao gồm tải wp từ bất kỳ vị trí nào

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );

2
Nhưng nếu bạn đã xác định ABSPATH và trailingslashit thì có lẽ bạn đã bao gồm tải wp.
Rupi
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.