Wordpress试图激活错误的插件

时间:2014-03-24 22:18:56

标签: php wordpress

当我尝试激活我编写的插件时,wordpres尝试会激活错误的插件,我说我转到Plugins->Installed Plugins并激活,wordpress会返回错误消息' anspress'插件无法找到。

我的插件名称"学院",文件夹名称"学院",插件文件名" academy.php"。

academy.php内容:

<?php
/**
 * @package Academy
 */
/*
Plugin Name: Academy
Description: Academy features
Version: 0.1
Author: Victor Aurélio Santos
Text Domain: academy
*/

/* is_plugin_active */
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );

define ('ACADEMY_INCLUDE', plugin_dir_path( __FILE__ ) . '/include');
define ('ACADEMY_TEMAPLE', ACADEMY_INCLUDE . '/templates');

global $academy_err; $academy_err = array();

$plugin_dependencies = array('woocommerce' => false,
                         'anspress' => false);

/* Dependencies check */
foreach ($plugin_dependencies as $plugin => &$enabled) {
  if (! $enabled = is_plugin_active("{$plugin}/{$plugin}.php") ) {
    $academy_err[] = "The {$plugin} plugin isn't installed and/or activated.";
  }
}

/* Check current theme, if not 'Academy' don't load files that depends... */
if ( "Academy" == wp_get_theme()->Name ) {
  include ACADEMY_INCLUDE . '/buddypress/bp-loader.php';
  include ACADEMY_INCLUDE . '/news-feed.php';
} else {
  $academy_err[] = "Current theme isn't \"Academy\" not loading NewsFeed...";
}

/* Check for woocommerce */
if ( $plugin_dependencies['woocommerce'] && $plugin_dependencies['anspress'] ){
  include ACADEMY_INCLUDE . '/anspress-woocommerce.php';
}

include (ACADEMY_INCLUDE . '/settings.php');


function academy_admin_notices() {
  global $academy_err;

  foreach ($academy_err as $err) {
?>
    <div class="update-nag">
      <p>Academy Error: <?php echo $err; ?></p>
    </div>
<?php
  }
}
add_action('admin_notices', 'academy_admin_notices');

function academy_init() {
  $plugin_dir = basename(dirname(__FILE__)) . '/languages';
  load_plugin_textdomain( 'academy', false, $plugin_dir );
}
add_action('plugins_loaded', 'academy_init');

function academy_plugin_action_links ($links, $file) {
  static $this_plugin;

  if (!$this_plugin) {
    $this_plugin = plugin_basename(__FILE__);
  }

  if ($file == $this_plugin) {
    $settings_link = '<a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?    page=academy-settings">' . __('Settings', 'academy') . '</a>';
    array_unshift($links, $settings_link);
  }

  return $links;
}
add_filter('plugin_action_links', 'academy_plugin_action_links', 10, 2);

我认为我的插件出了问题,但无法找到。

2 个答案:

答案 0 :(得分:1)

你的插件依赖于另一个名为'anspress'的插件,这就是你得到这个错误的原因。代码中的代码片段是问题的起源:

$plugin_dependencies = array('woocommerce' => false,
                         'anspress' => false);

/* Dependencies check */
foreach ($plugin_dependencies as $plugin => &$enabled) {
  if (! $enabled = is_plugin_active("{$plugin}/{$plugin}.php") ) {
    $academy_err[] = "The {$plugin} plugin isn't installed and/or activated.";
  }
}

添加插件'anspress',标记为依赖项或从该数组中删除它。

答案 1 :(得分:1)

在插件的根目录下,我们应该不惜一切代价直接调用WordPress函数。最佳实践是将所有内容封装在相关的钩子中。

但是函数get_option可以安全使用。有了它,我们处理include s。

对于其余部分,我们使用register_activation_hook在激活时获取活动插件。要检查所需插件的激活/停用,我们可以使用挂钩activate_$pluginNamedeactivate_$pluginName。可以使用钩子after_switch_theme捕获主题状态更改。

<?php
/**
 * Plugin Name: (SO) Academy
 * Plugin URI: http://stackoverflow.com/a/22648487/1287812
 * Description: Activate plugin, check for others, show warnings
 * Version: 0.1b
 * Author: Victor Aurélio Santos, brasofilo
 */

define ('ACADEMY_INCLUDE', plugin_dir_path( __FILE__ ) . '/include');
define ('ACADEMY_TEMAPLE', ACADEMY_INCLUDE . '/templates');

$academy_err = get_option('academy_err');
if( !isset( $academy_err['woocommerce'] ) && !isset( $academy_err['anspress'] ) )
{
    include ACADEMY_INCLUDE . '/anspress-woocommerce.php';
}
if( !isset( $academy_err['theme'] ) ) {
    include ACADEMY_INCLUDE . '/buddypress/bp-loader.php';
    include ACADEMY_INCLUDE . '/news-feed.php';
}
include (ACADEMY_INCLUDE . '/settings.php');

register_activation_hook(   __FILE__, 'academy_on_activation' );
add_action( 'admin_notices', 'academy_admin_notices' );
add_action( 'activate_woocommerce/woocommerce.php', 'activate_plugin_woocommerce' );

function academy_on_activation()
{
    $academy_err = array();
    $plugin_dependencies = array( 
        'woocommerce' => 'woocommerce/woocommerce.php', 
        'anspress'    => 'anspress/anspress.php'
    );

    /* Dependencies check */
    foreach ( $plugin_dependencies as $plugin => $file ) 
    {
        if ( !is_plugin_active( $file ) ) 
        {
            $academy_err[$plugin] = "The {$plugin} plugin isn't installed and/or activated.";
        }
    }

    /* Check current theme, if not 'Academy' don't load files that depends... */
    if ( 'Academy' !== wp_get_theme()->Name )
    {
        $academy_err['theme'] = "Current theme isn't \"Academy\" not loading NewsFeed...";
    }   

    update_option( 'academy_err', $academy_err );
}

function academy_admin_notices() {
    $academy_err = get_option('academy_err');

    foreach ($academy_err as $err) 
    {
        ?>
        <div class="update-nag">
            <p>Academy Error: <?php echo $err; ?></p>
        </div>
        <?php
    }
}

function activate_plugin_woocommerce()
{
    $academy_err = get_option('academy_err');
    unset( $academy_err['woocommerce'] );
    update_option( 'academy_err', $academy_err );
}

开始,摆脱defineglobal s here's a nice plugin base < / p>