Bagaimana cara memasukkan wp-load.php dari lokasi mana saja?

11

Saya memiliki plugin yang memanggil skrip php yang berdiri sendiri (myAjax.php) melalui skrip jQuery.ajax () di dalam plugin.

Saya perlu menempatkan kode berikut ke dalam file 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");
}

Namun, saya ingin metode yang lebih antipeluru untuk menentukan path ke wp-load.php jika path relatif sebenarnya berbeda dari contoh saya.

N2Mystic
sumber
Untuk menambahkan apa yang dikatakan Milo, berikut adalah 2 posting hebat tentang hal ini. garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress ( versi terakhir ) ottopress.com/2010/dont-include-wp-load-please ( versi terakhir ) Juga demi belajar , tayangan slide pertama andrewnacin.com/2011/04/16/wordcamp-seattle ( versi terakhir )
Wyck

Jawaban:

5

Anda dapat menggunakan __DIR__konstanta. Karena file tersebut ada di dalam plugin atau folder tema, yang selalu terletak di dalam wp-contentfolder .. Anda cukup mendapatkan path file dan memotong semuanya mulai wp-contentdari itu:

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

Jika Anda perlu memastikan wp tidak ada di dalam beberapa folder konten-wp (siapa tahu? Hal-hal terjadi) - gunakan lookahead negatif:

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

(karena lebih mudah untuk memastikan plugin Anda sendiri yang Anda kembangkan tidak terletak di dalam folder konten-wp lainnya)

Aaand .. Anda wp-loadada di sana:

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

Tapi!

Seperti yang telah disebutkan sebelumnya, untuk AJAX Anda dapat menggunakan teknik ajax asli WP-s .

Tentu saja, ada beberapa kasus ketika teknik WP asli AJAX tidak cukup.

Ilia Andrienko
sumber
3
wp-contentbisa tidak ada atau dalam direktori yang sama sekali berbeda dari WP.
fuxia
Ini mungkin cara terbaik. Jika Anda memiliki lokasi konten-wp aneh (tidak mungkin) sesuaikan saja regex Anda.
pguardiario
0

Saya tahu ini adalah pertanyaan lama tetapi ingin menambahkan jawaban saya sendiri yang saya pikir dapat membantu beberapa pengguna mencoba mencapai hal yang sama.

Ya itu selalu lebih baik (dan lebih mudah) untuk menggunakan WP Ajax API asli, tetapi bisa menjadi sangat lambat karena memuat seluruh contoh WP.

Solusi saya: cukup sederhana, dan harus berfungsi untuk mengambil rootinstalasi wordpress. Dalam skrip apa pun yang Anda lakukan panggilan AJAX kustom, pastikan Anda pertama kali mendaftarkan skrip dengan wp_register_script()(jangan enqueue dulu). Kemudian gunakan wp_localize_script()dan parsing ABSPATH(ini adalah konstanta yang didefinisikan di dalam wp-load.phpdan akan menahan path root). Anda sekarang dapat mengambil ini di dalam skrip Anda dan menguraikannya bersama dengan panggilan AJAX. Akhirnya tentu saja pastikan untuk benar-benar membuat skrip dengan wp_enqueue_script().

Contoh:

Cuplikan PHP di bawah ini akan membuat script.jsfile Anda enqueue , dan memungkinkan Anda untuk mengambil rootdir dengan menelepon pluginslug_scriptname_i18n.wp_root. Pada dasarnya wp_localize_script()ini digunakan untuk melakukan terjemahan, tetapi ini juga berguna untuk mem-parsing data ke skrip Anda yang diambil dari sisi server.

        $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 );

Anda script.jsbisa terlihat seperti ini:

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

Sekarang di dalam Anda, ajax-handler.phpAnda dapat mengambil wp_content_dirdan memuat wp-load.phpseperti Anda :

// 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();

Harap diingat bahwa wp_rootsisi klien dapat diubah.

Sebagai catatan:

Trik lain yang beberapa dari Anda mungkin tidak sadari adalah bahwa sebelum termasuk wp-load.phpAnda dapat mendefinisikan konstanta disebut SHORTINIT(boolean). Ini akan memberi tahu WordPress untuk hanya memuat dasar-dasarnya (artinya Anda akan kehilangan banyak fungsi inti WP) tetapi itu akan mempercepat waktu pemuatan karena tidak akan menyertakan semua file yang diperlukan untuk instance WP biasa. The SHORTINITdalam didefinisikan wp-settings.php(hanya membuka file dan mencari SHORTINIT. Anda akan memiliki pemahaman yang lebih baik tentang apa yang terjadi di bawah tenda. Trik bagus ini akan mempercepat beban kali bahkan lebih (sampai 75% dalam tes saya yang saya lakukan beberapa waktu yang lalu) .Tapi ini akan tergantung pada versi WP. Juga perlu diingat bahwa wp-load.phpperubahan sering dengan rilis baru versi WP, jadi jika Anda menggunakanSHORTINITpastikan bahwa skrip Anda akan selalu berfungsi bahkan di versi WordPress yang akan datang, dan juga dengan versi WordPress yang lebih rendah. Singkatnya, jika Anda melakukan hal-hal kompleks yang bergantung pada banyak kodeks WordPress, maka pastikan TIDAK diatur SHORTINITke true .

Rens Tillmann
sumber
-1

Anda dapat menggunakan kode di bawah ini untuk menggunakan wp-load.php untuk memasukkan wp-load dari lokasi mana pun

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
Nilesh Raut
sumber
2
Tetapi jika Anda telah menetapkan ABSPATH dan trailingslashit maka Anda mungkin sudah memasukkan wp-load.
Rup