web-dev-qa-db-fra.com

Déterminer où fopen () écrit des fichiers lorsqu'il est utilisé à partir de WordPress AJAX appel

J'ai un plugin WordPress qui utilise AJAX pour envoyer du courrier. Ça fonctionne bien. Maintenant, je veux mettre un peu de code pour écrire un fichier journal lorsque le courrier est envoyé.

Le paramètre $u est simplement un bout de texte à consigner.

function writeToLog( $u ) {
    $path = 'log.txt';
    $agent = $_SERVER['HTTP_USER_AGENT'];
    if (($h = fopen($path, "a")) !== FALSE) {
        $mystring = $u . ' ' . $agent . PHP_EOL;
        echo('mystring seems to be working');
        fwrite( $h, $mystring );
        fclose($h);
    }
    else
      die('WHAT IS GOING ON?');
}

Il semble que fopen() fonctionne, mais je ne trouve pas le fichier log.txt. Je pensais il se trouverait dans le même dossier que le plugin. Où ce fichier log.txt est-il écrit? Dois-je fournir un $path explicite pour écrire ce fichier dans le répertoire du plugin?

1
jchwebdev

Avec votre CODE tel quel, l'emplacement dans lequel le fichier log.txt sera écrit dépend de PWD (valeur du répertoire de travail actuel). Il peut s'agir de votre racine Web ou de tout autre endroit.

Cependant, étant donné que les appels WordPress AJAX sont passés vers wp-admin/admin-ajax.php fichier, PWD pour AJAX est presque toujours le répertoire wp-admin/. Ainsi, si vous utilisez le chemin du fichier en tant que $path = 'log.txt';, le fichier journal sera presque toujours créé dans le répertoire wp-admin/.

Maintenant, pour vous assurer qu'il est créé dans votre répertoire Plugin, vous pouvez utiliser:

function writeToLog( $u ) {
    // this will create the log where the CODE of this function is
    // adjust it to write within the plugin directory
    $path = dirname(__FILE__) . '/log.txt';
    $agent = $_SERVER['HTTP_USER_AGENT'];
    if (($h = fopen($path, "a")) !== FALSE) {
        $mystring = $u . ' ' . $agent . PHP_EOL;
        echo('mystring seems to be working');
        fwrite( $h, $mystring );
        fclose($h);
    }
    else
        die('WHAT IS GOING ON?');
}

Puisqu'il s'agit de WordPress (avec la configuration par défaut), vous pouvez également utiliser la constante ABSPATH pour l'écrire dans le Web Root:

$path = ABSPATH . 'log.txt';

BTW, il est toujours préférable d'écrire ces sortes de journaux dans votre propre répertoire de plugin au lieu de web root. Il vaut mieux que la racine Web ne soit pas accessible en écriture pour les scripts (bon pour la sécurité).

3
Fayaz