Come includere wp-load.php da qualsiasi posizione?


11

Ho un plugin che chiama uno script php autonomo (myAjax.php) tramite uno script jQuery.ajax () all'interno del plugin.

Devo inserire il seguente codice nel 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");
}

Tuttavia, vorrei un metodo più a prova di proiettile per specificare il percorso di wp-load.php nel caso in cui il percorso relativo effettivo sia diverso dal mio esempio.



Per aggiungere a ciò che ha detto Milo, ecco 2 grandi post sull'argomento. garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress ( ultima versione ) ottopress.com/2010/dont-include-wp-load-please ( ultima versione ) Anche per motivi di apprendimento , la prima presentazione andrewnacin.com/2011/04/16/wordcamp-seattle ( ultima versione )
Wyck,

Risposte:


5

Puoi usare __DIR__costante. Poiché il file si trova all'interno del plug-in o nella cartella dei temi, che si trovano sempre all'interno della wp-contentcartella .. Puoi semplicemente ottenere il percorso del file e tagliare tutto a partire wp-contentda esso:

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

Se devi assicurarti che il wp non sia all'interno di una cartella con contenuto wp (chissà? Le cose accadono) - usa il lookahead negativo:

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

(dal momento che è più facile essere sicuri che il proprio plugin che si sta sviluppando non si trovi all'interno di un'altra cartella wp-content)

Aaand .. il tuo wp-loadè lì:

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

Ma!

Come già menzionato, per AJAX è possibile utilizzare la tecnica ajax nativa di WP .

Naturalmente, ci sono casi in cui la tecnica AJAX nativa di WP non è sufficiente.


3
wp-contentpuò essere assente o in una directory completamente diversa da WP.
fuxia

Questo è probabilmente il modo migliore. Se hai una strana posizione di contenuto wp (improbabile) basta regolare la tua regex.
pguardiario,

0

So che questa è una vecchia domanda, ma volevo aggiungere la mia risposta, che penso possa aiutare alcuni utenti a cercare di ottenere la stessa cosa.

Sì, è sempre meglio (e più semplice) utilizzare l'API Ajax WP nativa, ma può diventare molto lenta perché carica l'intera istanza WP.

La mia soluzione: è abbastanza semplice e dovrebbe funzionare per recuperare l' rootinstallazione di wordpress. In qualunque script tu stia eseguendo la chiamata AJAX personalizzata, assicurati di registrare prima lo script wp_register_script()(non accodarlo ancora). Quindi utilizzare wp_localize_script()e analizzare il ABSPATH(questa è una costante che è definita all'interno wp-load.phpe conterrà il percorso di root). Ora puoi recuperarlo all'interno del tuo script e analizzarlo insieme alla chiamata AJAX. Infine, assicurati di accodare effettivamente la sceneggiatura con wp_enqueue_script().

Esempio:

Lo snippet PHP seguente accoderà il tuo script.jsfile e ti permetterà di recuperare la directory rootchiamando pluginslug_scriptname_i18n.wp_root. Fondamentalmente wp_localize_script()viene usato per fare traduzioni, ma questo diventa anche utile per analizzare i dati negli script che hai recuperato sul lato 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 );

Potresti script.jsassomigliare a questo:

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

Ora dentro di ajax-handler.phpte puoi recuperare wp_content_dire caricare il tuo wp-load.phplike così:

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

Tieni presente che è wp_rootpossibile modificare il lato client.

Come nota a margine:

Un altro trucco di cui alcuni di voi potrebbero non essere consapevoli è che prima di includere wp-load.phpè possibile definire una costante chiamata SHORTINIT(booleana). Questo dirà a WordPress di caricare solo le basi (il che significa che perderai molte funzioni principali di WP) ma accelererà il tempo di caricamento poiché non includerà tutti i file richiesti per un'istanza WP normale. L' SHORTINITinterno è definito wp-settings.php(basta aprire il file e cercare SHORTINIT. Si avrà una migliore comprensione di ciò che sta accadendo sotto il cofano. Questo trucco nifty permetterà di accelerare i tempi di caricamento ancora di più (fino al 75% nel mio test che ho fatto qualche tempo fa). Ciò dipenderà dalla versione di WP. Inoltre, tieni presente che le wp-load.phpmodifiche cambiano spesso con le nuove versioni delle versioni di WP, quindi se usiSHORTINITassicurati che lo script funzioni sempre anche nelle versioni future di WordPress e anche con una versione inferiore di WordPress. In breve, se fai cose complesse che dipendono molto dal codice WordPress, assicurati di NON impostare SHORTINITsu true .


-1

Puoi usare il codice qui sotto per usare wp-load.php per includere wp-load da qualsiasi posizione

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

2
Ma se hai ABSPATH set e trailingslashit definiti, probabilmente hai già incluso wp-load.
Rup,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.