2014-09-14 20:32:59 +00:00
< ? php
/**
* Includes the Plugin settings menu .
*
* @ filesource
* @ author Stefan Herndler
* @ since 1.5 . 0 12.09 . 14 10 : 26
*/
/**
* Handles the Settings interface of the Plugin .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
*/
class MCI_Footnotes_Layout_Init {
/**
* Slug for the Plugin main menu .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
* @ var string
*/
const C_STR_MAIN_MENU_SLUG = " mfmmf " ;
/**
* Plugin main menu name .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
* @ var string
*/
2014-09-15 16:33:23 +00:00
const C_STR_MAIN_MENU_TITLE = " ManFisher " ;
2014-09-14 20:32:59 +00:00
/**
*
* @ author Stefan Herndler
* @ since 1.5 . 0
* @ var array
*/
private $a_arr_SubPageClasses = array ();
/**
* Class Constructor . Initializes all WordPress hooks for the Plugin Settings .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
*/
public function __construct () {
// iterate through each class define in the current script
foreach ( get_declared_classes () as $l_str_ClassName ) {
// accept only child classes of the layout engine
if ( is_subclass_of ( $l_str_ClassName , 'MCI_Footnotes_LayoutEngine' )) {
/** @var MCI_Footnotes_LayoutEngine $l_obj_Class */
$l_obj_Class = new $l_str_ClassName ();
// append new instance of the layout engine sub class
$this -> a_arr_SubPageClasses [ $l_obj_Class -> getPriority ()] = $l_obj_Class ;
}
}
ksort ( $this -> a_arr_SubPageClasses );
// register hooks/actions
add_action ( 'admin_init' , array ( $this , 'initializeSettings' ));
add_action ( 'admin_menu' , array ( $this , 'registerMainMenu' ));
// register AJAX callbacks for Plugin information
add_action ( " wp_ajax_nopriv_footnotes_getPluginInfo " , array ( $this , " getPluginMetaInformation " ));
add_action ( " wp_ajax_footnotes_getPluginInfo " , array ( $this , " getPluginMetaInformation " ));
}
/**
* Initializes all sub pages and registers the settings .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
*/
public function initializeSettings () {
MCI_Footnotes_Settings :: instance () -> RegisterSettings ();
// iterate though each sub class of the layout engine and register their sections
/** @var MCI_Footnotes_LayoutEngine $l_obj_LayoutEngineSubClass */
foreach ( $this -> a_arr_SubPageClasses as $l_obj_LayoutEngineSubClass ) {
$l_obj_LayoutEngineSubClass -> registerSections ();
}
}
/**
* Registers the new main menu for the WordPress dashboard .
* Registers all sub menu pages for the new main menu .
*
* @ author Stefan Herndler
* @ since 2.0 . 2
* @ see http :// codex . wordpress . org / Function_Reference / add_menu_page
*/
public function registerMainMenu () {
global $menu ;
// iterate through each main menu
foreach ( $menu as $l_arr_MainMenu ) {
// iterate through each main menu attribute
foreach ( $l_arr_MainMenu as $l_str_Attribute ) {
// main menu already added, append sub pages and stop
if ( $l_str_Attribute == self :: C_STR_MAIN_MENU_SLUG ) {
$this -> registerSubPages ();
return ;
}
}
}
// add a new main menu page to the WordPress dashboard
add_menu_page (
self :: C_STR_MAIN_MENU_TITLE , // page title
self :: C_STR_MAIN_MENU_TITLE , // menu title
'manage_options' , // capability
self :: C_STR_MAIN_MENU_SLUG , // menu slug
array ( $this , " displayOtherPlugins " ), // function
2014-09-15 16:50:48 +00:00
plugins_url ( 'footnotes/img/main-menu.png' ), // icon url
2014-10-07 17:16:22 +00:00
null // position
2014-09-14 20:32:59 +00:00
);
$this -> registerSubPages ();
}
/**
* Registers all SubPages for this Plugin .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
*/
private function registerSubPages () {
// first registered sub menu page MUST NOT contain a unique slug suffix
// iterate though each sub class of the layout engine and register their sub page
/** @var MCI_Footnotes_LayoutEngine $l_obj_LayoutEngineSubClass */
foreach ( $this -> a_arr_SubPageClasses as $l_obj_LayoutEngineSubClass ) {
$l_obj_LayoutEngineSubClass -> registerSubPage ();
}
}
/**
* Displays other Plugins from the developers .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
*/
public function displayOtherPlugins () {
2014-10-01 20:57:16 +00:00
printf ( " <br/><br/> " );
// load template file
$l_obj_Template = new MCI_Footnotes_Template ( MCI_Footnotes_Template :: C_STR_DASHBOARD , " manfisher " );
echo $l_obj_Template -> getContent ();
2014-10-05 15:12:42 +00:00
printf ( '<em>visit <a href="http://manfisher.net/" target="_blank">ManFisher Medien ManuFaktur</a> or <a href="http://herndler.org" target="_blank">herndler.org</a></em>' );
2014-09-27 07:56:40 +00:00
printf ( " <br/><br/> " );
2014-10-01 20:57:16 +00:00
printf ( " <h3>%s</h3> " , __ ( 'Take a look on other Plugins we have developed.' , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ));
2014-10-07 17:16:22 +00:00
2014-09-27 07:56:40 +00:00
// collect plugin list as JSON
2014-10-07 17:16:22 +00:00
$l_arr_Response = wp_remote_get ( " http://herndler.org/project/other-wordpress-plugins.php " );
2014-09-27 07:56:40 +00:00
// check if response is valid
if ( is_wp_error ( $l_arr_Response )) {
printf ( __ ( " Error loading other WordPress Plugins from Manfisher. Sorry! " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ));
return ;
}
// get the body of the response
$l_str_Response = $l_arr_Response [ " body " ];
// convert the body to a json string
$l_arr_Plugins = json_decode ( $l_str_Response , true );
2014-10-07 17:16:22 +00:00
$l_str_Server = (( ! empty ( $_SERVER [ 'HTTPS' ]) && $_SERVER [ 'HTTPS' ] !== 'off' ) || $_SERVER [ 'SERVER_PORT' ] == 443 ) ? " https:// " : " http:// " . $_SERVER [ " SERVER_NAME " ];
2014-09-14 20:32:59 +00:00
// load template file
$l_obj_Template = new MCI_Footnotes_Template ( MCI_Footnotes_Template :: C_STR_DASHBOARD , " other-plugins " );
2014-09-27 07:56:40 +00:00
printf ( '<div id="the-list">' );
2014-09-14 20:32:59 +00:00
// iterate through each Plugin
foreach ( $l_arr_Plugins as $l_arr_PluginInfo ) {
2014-10-07 17:16:22 +00:00
$l_str_InstallButton = '<a class="install-now button" href="' . $l_str_Server . '/wp-admin/update.php?action=install-plugin&plugin=' . $l_arr_PluginInfo [ " name " ] . '&_wpnonce=e7a5c90faf" aria-label="Install ' . $l_arr_PluginInfo [ " title " ] . ' now">' . __ ( " Install now " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ) . '</a>' ;
$l_str_AlreadyInstalled = '<span class="button button-disabled" title="' . __ ( " This Plugin is already installed and up to date. " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ) . '">' . __ ( " Installed " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ) . '</span>' ;
$l_bool_isPluginInstalled = false ;
// iterate through each installed WordPress Plugin
foreach ( get_plugins () as $l_arr_Plugin ) {
if ( strtolower ( $l_arr_PluginInfo [ " title " ]) == strtolower ( $l_arr_Plugin [ " Name " ])) {
$l_bool_isPluginInstalled = true ;
break ;
}
}
// replace Plugin information
2014-09-14 20:32:59 +00:00
$l_obj_Template -> replace (
array (
2014-10-07 17:16:22 +00:00
" server " => $l_str_Server ,
" plugin-name " => $l_arr_PluginInfo [ " name " ],
" plugin-title " => $l_arr_PluginInfo [ " title " ],
" plugin-icon " => strlen ( $l_arr_PluginInfo [ " img " ]) > 0 ? " http://plugins.svn.wordpress.org/ " . $l_arr_PluginInfo [ " name " ] . " /assets/ " . $l_arr_PluginInfo [ " img " ] : " " ,
" install-link " => ! $l_bool_isPluginInstalled ? $l_str_InstallButton : $l_str_AlreadyInstalled ,
" more-details-label " => __ ( " More Details " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ),
" last-updated-label " => __ ( " Last Updated " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME )
2014-09-14 20:32:59 +00:00
)
);
// display Plugin
echo $l_obj_Template -> getContent ();
// reload template
$l_obj_Template -> reload ();
}
2014-09-27 07:56:40 +00:00
printf ( '</div>' );
2014-09-14 20:32:59 +00:00
}
/**
* AJAX call . returns a JSON string containing meta information about a specific WordPress Plugin .
*
* @ author Stefan Herndler
* @ since 1.5 . 0
*/
public function getPluginMetaInformation () {
// get plugin internal name from POST data
$l_str_PluginName = array_key_exists ( " plugin " , $_POST ) ? $_POST [ " plugin " ] : null ;
if ( empty ( $l_str_PluginName )) {
echo json_encode ( array ( " error " => " Plugin name invalid. " ));
exit ;
}
$l_str_Url = " https://api.wordpress.org/plugins/info/1.0/ " . $l_str_PluginName . " .json " ;
// call URL and collect data
$l_arr_Response = wp_remote_get ( $l_str_Url );
// check if response is valid
if ( is_wp_error ( $l_arr_Response )) {
2014-10-01 20:57:16 +00:00
echo json_encode ( array ( " error " => " Error receiving Plugin Information from WordPress. " ));
exit ;
}
if ( ! array_key_exists ( " body " , $l_arr_Response )) {
echo json_encode ( array ( " error " => " Error reading WordPress API response message. " ));
2014-09-14 20:32:59 +00:00
exit ;
}
// get the body of the response
$l_str_Response = $l_arr_Response [ " body " ];
// get plugin object
$l_arr_Plugin = json_decode ( $l_str_Response , true );
2014-10-01 20:57:16 +00:00
if ( empty ( $l_arr_Plugin )) {
2014-10-07 17:16:22 +00:00
echo json_encode ( array ( " error " => " Error reading Plugin meta information.<br/>URL: " . $l_str_Url . " <br/>Response: " . $l_str_Response ));
2014-10-01 20:57:16 +00:00
exit ;
}
2014-09-14 20:32:59 +00:00
2014-10-07 17:16:22 +00:00
$l_int_NumRatings = array_key_exists ( " num_ratings " , $l_arr_Plugin ) ? intval ( $l_arr_Plugin [ " num_ratings " ]) : 0 ;
$l_int_Rating = array_key_exists ( " rating " , $l_arr_Plugin ) ? floatval ( $l_arr_Plugin [ " rating " ]) : 0.0 ;
$l_int_Stars = round ( 5 * $l_int_Rating / 100.0 , 1 );
2014-09-14 20:32:59 +00:00
// return Plugin information as JSON encoded string
echo json_encode (
array (
" error " => " " ,
2014-10-01 20:57:16 +00:00
" PluginDescription " => array_key_exists ( " short_description " , $l_arr_Plugin ) ? html_entity_decode ( $l_arr_Plugin [ " short_description " ]) : " Error reading Plugin information " ,
2014-10-07 17:16:22 +00:00
" PluginAuthor " => array_key_exists ( " author " , $l_arr_Plugin ) ? html_entity_decode ( $l_arr_Plugin [ " author " ]) : " unknown " ,
" PluginRatingText " => $l_int_Stars . " " . __ ( " rating based on " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ) . " " . $l_int_NumRatings . " " . __ ( " ratings " , MCI_Footnotes_Config :: C_STR_PLUGIN_NAME ),
" PluginRating1 " => $l_int_NumRatings >= 0.5 ? " star-full " : " star-empty " ,
" PluginRating2 " => $l_int_NumRatings >= 1.5 ? " star-full " : " star-empty " ,
" PluginRating3 " => $l_int_NumRatings >= 2.5 ? " star-full " : " star-empty " ,
" PluginRating4 " => $l_int_NumRatings >= 3.5 ? " star-full " : " star-empty " ,
" PluginRating5 " => $l_int_NumRatings >= 4.5 ? " star-full " : " star-empty " ,
" PluginRating " => $l_int_NumRatings ,
" PluginLastUpdated " => array_key_exists ( " last_updated " , $l_arr_Plugin ) ? $l_arr_Plugin [ " last_updated " ] : " unknown " ,
" PluginDownloads " => array_key_exists ( " downloaded " , $l_arr_Plugin ) ? $l_arr_Plugin [ " downloaded " ] : " --- "
2014-09-14 20:32:59 +00:00
)
);
exit ;
}
}