Write from WordPress plugin to text file with PHP

WendiT picture WendiT · Aug 29, 2014 · Viewed 15.3k times · Source

I am trying to write date to a text file from a WordPress plugin. While this works for a single PHP file it doesn't write when I add the code to the plugin. The TXT file has permission 777 and is in the same directory as the plugin file.

What am I doing wrong?

This is the plugin and the lines I have added are in the block //log 404s to text file:

 <?php
 /*
 Plugin Name: Mail me 404 errors
 Plugin URI: http://me.com
 Description: A 404 status triggers an email with details.
 Version: 1.0
 Author: Me
 Author URI: http://me.com
 */
 //SENDS 404 EMAIL TO ADMIN


 function email_admin($location){   
     // ip address
     $ipaddress = $_SERVER['REMOTE_ADDR'];
     if (!empty($_SERVER['X_FORWARDED_FOR'])) {
         $X_FORWARDED_FOR = explode(',', $_SERVER['X_FORWARDED_FOR']);
     }
     elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
         $X_FORWARDED_FOR = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
     }
     else {$ipaddress = "undefined";}
     if (!empty($X_FORWARDED_FOR)) {
         $ipaddress = trim($X_FORWARDED_FOR[0]);
     }

     // site info
     $blname=get_option('blogname');
     $admemail = get_option('admin_email');
     $honeypot = "http://www.projecthoneypot.org/ip_".$ipaddress;

     // time log
     $time = date("F jS Y, H:i", time()+25200);

     //referrer
     function current_page_url(){
         $page_url = 'http';
         if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){
         $page_url .= 's';
     }
     return $page_url.'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
 }
 if(isset($_SESSION['referrer'])){
    $referrer = $_SESSION['referrer'];
 } elseif(isset($_SERVER['HTTP_REFERER'])){
    $referrer = $_SERVER['HTTP_REFERER'];
 } else {$referrer = "undefined";}
    $_SESSION['referrer'] = current_page_url();

 // query string
 if (isset($_SERVER['QUERY_STRING'])) { 
    $string = $_SERVER['QUERY_STRING']; 
 } else {
    $string = "undefined";
 }

 // request URI
 if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER["HTTP_HOST"])) {
    $request = 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
 } else {
    $request = "undefined";
 }

 // identity
 if (isset($_SERVER['REMOTE_IDENT'])) {
    $remote = $_SERVER['REMOTE_IDENT'];
 } else {
    $remote = "undefined";
 }

 // user agent
 if (isset($_SERVER['HTTP_USER_AGENT'])) {
    $agent = $_SERVER['HTTP_USER_AGENT'];
 } else {
    $agent = "undefined";
 }

 //log 404s to txt file
 $ipad = $_SERVER['REMOTE_ADDR'];
 $ban = "#$time\r\n$ipad\r\n"; 
 $file = "errors.txt"; 
 $open = @fopen($file, "a"); 
 $write = @fputs($open, $ban); 
 @fclose($open);
 //log 404s to txt file

 $mailhead = "MIME-Version: 1.0\r\n";
 $mailhead .= "Content-type: text/plain; charset=UTF-8\r\n";
 $mailhead .= 'From: "' . $blname . '" <' .$admemail. ">\r\n";
 $mailsubj= $blname.': 404 error';
 $mailintro = "Someone wanted to go to ".$request.", but it doesn't exist. Maybe you can have a look and see if anything needs to be fixed.\r\n";
 $mailbody=

    $mailintro . "\n" .

    "TIME: "            . $time    . "\n" . 
    "*404: "            . $request . "\n" . 
    "REFERRER: "        . $referer . "\n" . 
    "QUERY STRING: "    . $string  . "\n" . 
    "REMOTE ADDRESS: "  . $ipaddress . "\n" . 
    "REMOTE IDENTITY: " . $remote  . "\n" . 
    "USER AGENT: "      . $agent   . "\n" .
    "CHECK WHOIS: https://who.is/whois-ip/ip-address/". $ipaddress . "\n" .
    "CHECK IP ADDRESS: " . $honeypot . "\n\n\n";

 @mail($admemail,$mailsubj,$mailbody,$mailhead);
 }
 function mail_me_errors(){
    global $wp_query;
    $location=$_SERVER['REQUEST_URI'];
     if ($wp_query->is_404){
        email_admin($location);
     }
 }
 add_action('get_header', 'mail_me_errors');
 ?>

Answer

brasofilo picture brasofilo · Sep 1, 2014

Pass the full path of the file /wp-content/plugins/your-plugin/errors.txt to fopen with plugin_dir_path():

$file = plugin_dir_path( __FILE__ ) . '/errors.txt'; 
$open = fopen( $file, "a" ); 

The following is a minimum example:

add_action( 'get_header', 'mail_me_errors' );

function mail_me_errors() {
    if ( is_404() ) {
        email_admin( $_SERVER['REQUEST_URI'] );
    }
}

function email_admin( $location ) {   
    $time = date( "F jS Y, H:i", time()+25200 );
    $ban = "#$time\r\n$location\r\n"; 
    $file = plugin_dir_path( __FILE__ ) . '/errors.txt'; 
    $open = fopen( $file, "a" ); 
    $write = fputs( $open, $ban ); 
    fclose( $open );
}