Comment inclure wp-load.php à partir de n'importe quel emplacement?

11

J'ai un plugin qui appelle un script php autonome (myAjax.php) via un script jQuery.ajax () à l'intérieur du plugin.

J'ai besoin de placer le code suivant dans le fichier 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");
}

Cependant, j'aimerais une méthode plus à l'épreuve des balles pour spécifier le chemin vers wp-load.php au cas où le chemin relatif réel est différent de mon exemple.

N2Mystic
la source
Pour ajouter à ce que Milo a dit, voici 2 excellents articles sur le sujet. garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress ( dernière version ) ottopress.com/2010/dont-include-wp-load-please ( dernière version ) Aussi pour le plaisir d'apprendre , le premier diaporama andrewnacin.com/2011/04/16/wordcamp-seattle ( dernière version )
Wyck

Réponses:

5

Vous pouvez utiliser __DIR__constant. Étant donné que le fichier se trouve soit dans le dossier du plugin ou du thème, qui sont toujours situés dans le wp-contentdossier .. Vous pouvez simplement obtenir le chemin du fichier et couper tout à partir wp-contentde celui-ci:

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

Si vous devez vous assurer que le wp ne se trouve pas dans un dossier de contenu wp (qui sait? Des choses se produisent) - utilisez un lookahead négatif:

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

(car il est plus facile de s'assurer que votre propre plugin que vous développez ne se trouve pas dans un autre dossier wp-content)

Aaand .. votre wp-loadest là:

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

Mais!

Comme mentionné précédemment, pour AJAX, vous pouvez utiliser la technique ajax native de WP-s .

Bien sûr, il existe des cas où la technique AJAX native de WP n'est pas suffisante.

Ilia Andrienko
la source
3
wp-contentpeut être absent ou dans un répertoire complètement différent de WP.
fuxia
C'est probablement le meilleur moyen. Si vous avez un emplacement de contenu wp étrange (peu probable), ajustez simplement votre regex.
pguardiario
0

Je sais que c'est une vieille question mais je voulais ajouter ma propre réponse qui, je pense, pourrait aider certains utilisateurs à essayer d'obtenir la même chose.

Oui, il est toujours préférable (et plus facile) d'utiliser l'API WP Ajax native, mais cela peut devenir très lent car il charge l'intégralité de l'instance WP.

Ma solution: est assez simple, et devrait fonctionner pour récupérer l' rootinstallation de wordpress. wp_register_script()Quel que soit le script avec lequel vous effectuez l'appel AJAX personnalisé, assurez-vous tout d'abord d'enregistrer le script avec (ne pas le mettre en file d'attente pour le moment). Ensuite, utilisez wp_localize_script()et analysez le ABSPATH(c'est une constante qui est définie à l'intérieur wp-load.phpet qui tiendra le chemin racine). Vous pouvez maintenant récupérer cela dans votre script et l'analyser avec l'appel AJAX. Enfin, bien sûr, assurez-vous de réellement mettre le script en file d'attente avec wp_enqueue_script().

Exemple:

L'extrait PHP ci-dessous mettra votre script.jsfichier en file d' attente et vous permettra de récupérer le rootrépertoire en appelant pluginslug_scriptname_i18n.wp_root. Fondamentalement, le wp_localize_script()est utilisé pour effectuer des traductions, mais cela devient également utile pour analyser les données dans votre ou vos scripts que vous avez récupérés côté serveur.

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

Votre script.jspourrait ressembler à ceci:

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

Maintenant, à l'intérieur de votre, ajax-handler.phpvous pouvez récupérer wp_content_diret charger votre wp-load.phpcomme ceci:

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

Veuillez garder à l'esprit que le wp_rootcôté client peut être modifié.

En remarque:

Une autre astuce que certains d'entre vous ne connaissent peut-être pas est qu'avant l'inclusion, wp-load.phpvous pouvez définir une constante appelée SHORTINIT(booléenne). Cela indiquera à WordPress de charger simplement les bases (ce qui signifie que vous perdrez beaucoup de fonctions principales de WP) mais cela accélérera le temps de chargement car il n'inclura pas tous les fichiers requis pour une instance WP normale. Le SHORTINITest défini à l'intérieur wp-settings.php(ouvrez simplement le fichier et recherchez SHORTINIT. Vous aurez une meilleure compréhension de ce qui se passe sous le capot. Cette astuce astucieuse accélérera encore plus les temps de chargement (jusqu'à 75% dans mes tests que j'ai faits) il y a un certain temps). Mais cela dépendra de la version WP. Gardez également à l'esprit que les wp-load.phpchangements sont fréquents avec les nouvelles versions des versions WP, donc si vous utilisezSHORTINITassurez-vous que votre script fonctionnera toujours, même dans les futures versions de WordPress, et également avec la version inférieure de WordPress. En bref, si vous faites des choses complexes qui reposent sur une grande partie du codex de WordPress, alors assurez - vous pas mis SHORTINITà vrai .

Rens Tillmann
la source
-1

Vous pouvez utiliser le code ci-dessous pour utiliser wp-load.php pour inclure wp-load à partir de n'importe quel emplacement

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
Nilesh Raut
la source
2
Mais si vous avez défini ABSPATH et que trailingslashit est défini, vous avez probablement déjà inclus wp-load.
Rup