Cum să incluzi wp-load.php din orice locație?

18 aug. 2011, 18:48:56
Vizualizări: 87K
Voturi: 14

Am un plugin care apelează un script PHP independent (myAjax.php) prin intermediul unui script jQuery.ajax() din interiorul pluginului.

Trebuie să pun următorul cod în fișierul myAjax.php:

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

if (!is_user_logged_in()){
    die("Trebuie să fii autentificat pentru a accesa această secțiune");
}
if( ! current_user_can('edit_files')) {
    die("Ne pare rău, nu ești autorizat să accesezi acest fișier");
}

Cu toate acestea, aș dori o metodă mai sigură de a specifica calea către wp-load.php în cazul în care calea relativă reală este diferită de exemplul meu.

3
Comentarii

Nu face asta. Folosește AJAX în modul corect WordPress.

Milo Milo
18 aug. 2011 19:00:01

Pentru a completa ce a spus Milo, iată 2 articole excelente pe această temă. http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/ (ultima versiune ) http://ottopress.com/2010/dont-include-wp-load-please/ (ultima versiune ) De asemenea, în scopul învățării, primul slideshow http://andrewnacin.com/2011/04/16/wordcamp-seattle/ (ultima versiune )

Wyck Wyck
18 aug. 2011 19:17:14

Ar trebui să folosești un endpoint REST API în loc de un fișier separat, astfel încât să obții un URL frumos și nu trebuie să încarci/bootstrap-ezi WP. Fișierele PHP independente ca acesta reprezintă un risc de securitate și aduc multe probleme

Tom J Nowell Tom J Nowell
3 oct. 2022 14:49:30
Toate răspunsurile la întrebare 5
2
11

Poți folosi constanta __DIR__. Deoarece fișierul se află fie în folderul pluginului, fie în cel al temei, care sunt întotdeauna localizate în folderul wp-content... Poți pur și simplu să obții calea fișierului și să tai totul începând de la wp-content din ea:

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

Dacă trebuie să te asiguri că wp nu se află în vreun folder wp-content (cine știe? se întâmplă lucruri ciudate) - folosește negative lookahead:

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

(deoarece este mai ușor să fii sigur că propriul tău plugin pe care îl dezvolți nu este localizat în alt folder wp-content)

Șiiii... wp-load este acolo:

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

Best Practice

După cum am menționat anterior, pentru AJAX ar trebui să folosești tehnica admin-ajax din WordPress sau noul REST API.

3 iun. 2015 20:59:40
Comentarii

wp-content poate lipsi sau poate fi într-un director complet diferit față de WP.

fuxia fuxia
3 iun. 2015 21:45:52

Aceasta este probabil cea mai bună metodă. Dacă ai o locație neobișnuită pentru wp-content (puțin probabil), ajustează pur și simplu expresia ta regulată.

pguardiario pguardiario
27 nov. 2016 04:37:16
0

Știu că aceasta este o întrebare veche, dar am dorit să adaug propriul meu răspuns, care cred că ar putea ajuta unii utilizatori care încearcă să obțină același lucru.

Da, este întotdeauna mai bine (și mai ușor) să folosești API-ul nativ WP Ajax, dar acesta poate deveni foarte lent deoarece încarcă întreaga instanță WordPress.

Soluția mea: este destul de simplă și ar trebui să funcționeze pentru a obține root-ul instalării WordPress. În orice script faci apelul AJAX personalizat, asigură-te că mai întâi înregistrezi scriptul cu wp_register_script() (nu-l încărca încă). Apoi folosește wp_localize_script() și parsează ABSPATH (aceasta este o constantă definită în interiorul wp-load.php și va conține calea rădăcină). Acum poți obține această informație în interiorul scriptului tău și să o transmiți împreună cu apelul AJAX. În final, asigură-te că încarci efectiv scriptul cu wp_enqueue_script().

Exemplu:

Fragmentul PHP de mai jos va încărca fișierul tău script.js și îți permite să obții directorul root apelând pluginslug_scriptname_i18n.wp_root. Practic, wp_localize_script() este folosit pentru traduceri, dar acest lucru este util și pentru a transmite date în scripturile tale pe care le-ai obținut pe partea de server.

        $handle = 'pluginslug-scriptname'; // Setează handle-ul scriptului
        $name = str_replace( '-', '_', $handle ) . '_i18n'; // Va converti handle-ul în 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', // @ACESTA VA CONȚINE URL-UL TĂU AJAX :) Pentru a obține această informație în interiorul script.js, apelează simplu: pluginslug_scriptname_i18n.ajax_url
                'wp_root' => ABSPATH // @ACESTA VA CONȚINE CALEA RĂDĂCINĂ :) Pentru a obține această informație în interiorul script.js, apelează simplu: pluginslug_scriptname_i18n.wp_root
            )
        );
        wp_enqueue_script( $handle );

Fișierul tău script.js ar putea arăta astfel:

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 ){
            if (this.status == 200) {
                // Succes:
            }
            // Finalizat:
        }
    };
    xhttp.onerror = function () {
      console.log(this);
      console.log("** A apărut o eroare în timpul tranzacției");
    };
    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);

Acum, în interiorul fișierului tău ajax-handler.php, poți obține wp_content_dir și încărca wp-load.php astfel:

// Setează tipul corect de conținut
header('Content-Type: text/html');
// Dezactivează caching-ul
header('Cache-Control: no-cache');
header('Pragma: no-cache');
// Obține payload-ul
$request_body = json_decode( file_get_contents('php://input'), true );  

// Setează aceasta pe true pentru a încărca doar elementele de bază!
// Setează aceasta pe true doar dacă știi ce faci
// Consultă SHORTINIT în wp-settings.php pentru mai multe detalii
define( 'SHORTINIT', false ); 

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

Te rog să ții cont că wp_root poate fi modificat pe partea de client.

Ca o notă suplimentară:

Un alt truc pe care unii dintre voi s-ar putea să nu-l cunoașteți este că înainte de a include wp-load.php poți defini o constantă numită SHORTINIT (boolean). Aceasta va spune WordPress să încarce doar elementele de bază (ceea ce înseamnă că vei pierde multe funcții din nucleul WP), dar va accelera timpul de încărcare deoarece nu va include toate fișierele necesare pentru o instanță obișnuită WordPress. SHORTINIT este definit în interiorul wp-settings.php (deschide fișierul și caută SHORTINIT. Vei avea o mai bună înțelegere a ceea ce se întâmplă în spate. Acest truc util va accelera și mai mult timpii de încărcare (până la 75% în testele pe care le-am făcut acum ceva timp). Dar acest lucru va depinde de versiunea WordPress. De asemenea, ține cont că wp-load.php se schimbă frecvent cu noile versiuni de WordPress, așa că dacă folosești SHORTINIT, asigură-te că scriptul tău va funcționa întotdeauna chiar și în versiunile viitoare de WordPress, dar și în versiuni mai vechi. Pe scurt, dacă faci lucruri complexe care se bazează pe mult cod WordPress, asigură-te că NU setezi SHORTINIT pe true.

10 iul. 2019 19:39:07
0

Propun această metodă ca o soluție "infallibilă" pentru a găsi calea către wp-load.php, atâta timp cât acesta se află într-un director deasupra locației unde rulează scriptul.

echo get_wp_abspath('wp-load.php') . PHP_EOL;

function get_wp_abspath($filename)
{
  $_DIR = __DIR__; // locația acestui script

  $_FILE = $_DIR . '/' . $filename; // cale_completă/fișier

  while(!file_exists($_FILE)) // dacă nu este găsit
  {
    $_DIR = dirname($_DIR); // urcă un nivel (ex. ../)

    $_FILE = $_DIR . '/' . $filename; // noua cale_completă/fișier

    if($_DIR == '/') return FALSE; // dacă am ajuns la rădăcină, eșuează
  }

  return $_FILE; // dacă fișierul este găsit, returnează cale_completă/fișier
}
27 dec. 2022 11:56:11
0

Nu ar

include $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php';

funcționa în majoritatea situațiilor?

WPINC și ABSPATH nu sunt definite în acest moment (dacă sunt, wp-load.php a fost probabil deja inclus, după cum a menționat cineva.

12 iun. 2024 15:47:21
1
-1

Puteți utiliza codul de mai jos pentru a încărca wp-load.php din orice locație

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
10 ian. 2020 11:31:09
Comentarii

Dar dacă ai ABSPATH setat și trailingslashit definit, atunci probabil că ai inclus deja wp-load.

Rup Rup
10 ian. 2020 11:43:08