使用plugin_basename时出现PHP致命错误

时间:2012-03-01 作者:nandac

我正在编写我的第一个插件,并调用plugin_basename(__FILE__) 函数结果为:

PHP致命错误:调用未定义的函数plugin\\u basename()

我的插件位于标准wp-content/plugins/下自己的目录中。我也在使用wordpress 3.3.1,并查看了codex,但没有发现任何错误。出现故障的代码块如下所示:

<?php
/*
Plugin Name: Send Invitation
Plugin URI: http://w3boutique.net
Description: Emails a the link of the current page to a friend
Author: Nandakumar Chandrasekhar
Version: 0.1wp-includes/plugin.php
Author URI: http://w3boutique.net/about-nanda.html
License: GPL2
*/

define( \'SEND_INVITATION_VERSION\', \'0.1\' );

define( \'SEND_INVITATION_REQUIRED_WP_VERSION\', \'3.3.1\' );

// Check if following are required

if ( ! defined( \'SEND_INVITATION_PLUGIN_BASENAME\' ) ) {
    define( \'SEND_INVITATION_PLUGIN_BASENAME\', plugin_basename(__FILE__) );
 }

if ( ! defined( \'SEND_INVITATION_PLUGIN_NAME\' ) ) {
    define( \'SEND_INVITATION_PLUGIN_NAME\', trim( dirname(     SEND_INVITATION_PLUGIN_BASENAME ), \'/\' ) );
}

if ( ! defined( \'SEND_INVITATION_PLUGIN_DIR\' ) ) {
    define( \'SEND_INVITATION_PLUGIN_DIR\', WP_PLUGIN_DIR . \'/\' . SEND_INVITATION_PLUGIN_NAME );
}

if ( ! defined( \'SEND_INVITATION_PLUGIN_URL\' ) ) {
define( \'SEND_INVITATION_PLUGIN_URL\', WP_PLUGIN_URL . \'/\' . SEND_INVITATION_PLUGIN_NAME );
}

// Version check
global $wp_version;

// Message to send if version is below the required version
$exit_msg = \'Send Invitation requires WordPress or newer\' .   SEND_INVITATION_REQUIRED_WP_VERSION . \' <a href="http://codex.wordpress.org/Upgrading_WordPress">Please update!</a>\';

if ( version_compare( $wp_version, SEND_INVITATION_REQUIRED_WP_VERSION, "<" ) ) {
    exit( $exit_msg );
}

function add_send_invitation_link() {
    wp_enqueue_script(\'jquery\');
    wp_enqueue_script( \'show_form.js\', SEND_INVITATION_PLUGIN_URL . \'/js/show_form.js\' );
    wp_enqueue_style( \'send-invitation.css\', SEND_INVITATION_PLUGIN_URL . \'/css/send-invitation.css\' );

    # TODO Put this in another file and include it
    $invitation_form = \'
    <h1><a href="#" onclick="show_form();">Send Invitation</a></h1>
    <form id="invitation-form" method="post" action="javascript:void(0);">
        <p>
            Your Email Address<br />
            <input type="text" name="email" />
        </p>
        <p>
            \' . "Friend\'s Email Address" . \'<br />
            <input type="text" name="email" />
        </p>
        <p>
            Subject<br />
            <input type="text" name="subject" />
        </p>
        <p>
            Message<br/>
            <textarea rows="10" cols="20"></textarea>
        </p>
        <p><input type="submit" name="submit" value="Send" /></p>
     </form>
     <script type="text/javascript">
          jQuery("#invitation-form").submit(function(){
          alert("got here");
          var str = "this";
          jQuery.ajax("\' . SEND_INVITATION_PLUGIN_URL . \'/form-processor.php?action=send_email", str, function(result){
        alert(result);
        });
        alert("finished");
        return(false);
    });
   </script>\';

   return $invitation_form;
}

function send_email() {
     error_log("Inside send email", 0);
     $subject = \'test\';
     $message = \'this is a test from send invitation\';
     $to = \'[email protected]\';
     wp_mail($to, $subject, $message);
}

?>
如果你能给我指点一下我这里可能做错了什么,我将不胜感激。

提前谢谢。

2 个回复
最合适的回答,由SO网友:nandac 整理而成

我知道这已经有一段时间了,但上述问题的答案是为插件创建一个主文件,并要求主文件中包含所需的所有相关文件。这样可以避免问题,因为主文件只调用一次,并且将定义常量。

当第二次访问文件并再次初始化常量时,就会出现问题,这会导致WP函数未定义。将与插件相关的所有函数放在一个类中,然后通过添加一个在init 类似这样的事件

add_action(\'init\', array( $this, \'my_plugin_init\');
plugin\\u init将包含代码new self; 它将inturen调用\\uu构造,该构造将初始化所有变量。这样,对象存在,所有函数和常量也存在。

希望有帮助。:-)

SO网友:Dwayne Charrington

我以前多次遇到过这个问题。只需将其添加到注释块下插件的顶部即可。plugin\\u basename返回值的方式似乎与其他方法不太一样。

$basename = plugin_basename(__FILE__);
然后更换此行:

define( \'SEND_INVITATION_PLUGIN_BASENAME\', plugin_basename(__FILE__) );
换言之:

define( \'SEND_INVITATION_PLUGIN_BASENAME\', $basename );

Updated based on feedback.

因此,您似乎无法访问函数plugin\\u basename,为了在插件中临时解决此问题,请添加此函数。

function the_plugin_basename($file) {
    $file = str_replace(\'\\\\\',\'/\',$file); // sanitize for Win32 installs
    $file = preg_replace(\'|/+|\',\'/\', $file); // remove any duplicate slash
    $plugin_dir = str_replace(\'\\\\\',\'/\',WP_PLUGIN_DIR); // sanitize for Win32 installs
    $plugin_dir = preg_replace(\'|/+|\',\'/\', $plugin_dir); // remove any duplicate slash
    $mu_plugin_dir = str_replace(\'\\\\\',\'/\',WPMU_PLUGIN_DIR); // sanitize for Win32 installs
    $mu_plugin_dir = preg_replace(\'|/+|\',\'/\', $mu_plugin_dir); // remove any duplicate slash
    $file = preg_replace(\'#^\' . preg_quote($plugin_dir, \'#\') . \'/|^\' . preg_quote($mu_plugin_dir, \'#\') . \'/#\',\'\',$file); // get relative path from plugins dir
    $file = trim($file, \'/\');
    return $file;
}
然后在插件中更改对函数的任何引用plugin_basename(), 到the_plugin_basename() 相反这将使我们克服无法调用该函数的错误,如果运气好的话,我们可能会看到另一个错误告诉我们发生了什么。

结束

相关推荐