在插件的基础上,我们应该不惜一切代价避免直接调用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 );
}
一开始
oop
并摆脱
define
s和
global
s
,
here's a nice plugin base
.