wordpress插件-如何制作,因此只有我的插件才能访问自己的文件

时间:2019-02-16 21:20:58

标签: php wordpress plugins

我正在开发一个wordpress插件,想知道如何制作它,以便只有我的插件才能访问它自己的文件。基本上是在寻找类似的东西:

defined('ABSPATH') or die();

我想我曾经在别人的插件中看到过类似的东西:

defined('PLUGINNAME') or die();

我不知道它是如何工作的,但是我想知道是否有任何类似的东西只能使我的插件“ require_once(plugin_dir_path(__ FILE __)。'secondpluginfile.php');”;它自己的文件。 (__和FILE之间的空格,因为否则stackoverflow会尝试使其变为粗体)。不确定此限制是否内置于wordpress中(可能不是因为某些插件具有加载项),或者是否必须添加一些内容才能实现此目的。只是将插件名称或其他内容放入“ defined()”函数中,还是需要先进行设置?

2 个答案:

答案 0 :(得分:0)

您可以放

defined('ABSPATH') or die();

在您的插件代码的开头。实际上,它所做的是检查是否定义了ABSPATH。如果未定义,它将执行die()并停止执行您的插件文件。

ABSPATH是在wp-config.php第86行中定义的常数。当wordpress尝试执行插件时,将定义ABSPATH常数。但是,如果其他人尝试直接执行您的插件文件,则不会定义ABSPATH,在这种情况下,您的脚本将无法执行。

完成相同结果的另一种方法是检查add_action函数。

if ( !function_exists( 'add_action' ) ) {
    echo 'Hi there!  I\'m just a plugin, not much I can do when called directly.';
    exit;
}

代码参考:Akismet Plugin。您可以看一下他们的源代码。据我所知,这个插件是wordpress包附带的。

答案 1 :(得分:0)

因此,基本上,如果您的插件是单个php文件,则在安装并激活插件后,应用程序的其余部分将可以访问文件中包含的所有功能和逻辑。

但是,大多数插件并非以这种方式设计的。充当插件入口点的plugin filename通常通过简单地包括它们或根据通过hooks在站点上发生的事件来调用类和函数来将其余文件加载到插件目录中。

因此,如果您只希望插件能够访问其自己的文件,则可以做一些事情。

首先,在主插件文件的顶部添加defined('ABSPATH') or die();。正如用户Ifty所写,“ ABSPATH是wp-config.php第86行中定义的常量。当wordpress尝试执行您的插件时,ABSPATH常量将被定义。但是如果其他人试图直接执行您的插件文件,将不会定义ABSPATH,在这种情况下您的脚本将不会执行。”

这样可以防止您的文件在Wordpress上下文之外直接访问。

要保护插件的文件不受网站其他部分的影响,只需将主插件文件中的任何includerequire_once语句或代码包装在仅根据条件调用的函数或类中您设置。例如

<?php
  /*
   Plugin Name: Example plugin 
   Plugin URI: http://stackoverflow.com/
   Version: 1.0
  */

  defined('ABSPATH') or die();

  add_action('your-custom-action', 'protector_function'); 

  function protector_function(){
      if ( current_user_can('manage_options') ) { //checks if user is admin you can use whichever conditions you want here
            require_once plugin_dir_path( __FILE__ ) . 'filename-with-plugin-code.php';

            // any other plugin code here
      }
  }

您可以定义自己的操作并使用do_action()reference)进行调用,以确保仅在整个应用程序中指定的位置调用插件代码。

存在Wordpress插件来扩展Wordpress的功能,因此,如果您根本不希望以任何方式从Wordpress访问代码,我不确定插件是正确的解决方案。

希望这会有所帮助!