代码之家  ›  专栏  ›  技术社区  ›  Victor Aurélio

Wordpress试图激活错误的插件

  •  2
  • Victor Aurélio  · 技术社区  · 12 年前

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

    我的插件名为“Academy”,文件夹名为“Academy”,插件文件名为“cademy.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 回复  |  直到 12 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

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

    函数 get_option 但使用起来很安全。有了它,我们处理 include s

    对于其余部分,我们使用 register_activation_hook 在激活时获取活动插件。为了检查所需插件的激活/停用,我们可以使用钩子 activate_$pluginName deactivate_$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 );
    }
    

    一开始 并摆脱 define s和 global s , here's a nice plugin base .

        2
  •  1
  •   Nathan Dawson    12 年前

    你的插件依赖于另一个名为“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”,要么将其从该数组中删除。

    推荐文章