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 1.5.0
* @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
plugins_url( 'footnotes/img/main-menu.png' ), // icon url
null // position
);
$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() {
printf( '
' );
// load template file
$l_obj_Template = new MCI_Footnotes_Template( MCI_Footnotes_Template::C_STR_DASHBOARD, 'manfisher' );
echo $l_obj_Template->getContent();
printf( 'visit Mark Cheret' );
printf( '
' );
printf( '' );
}
/**
* 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 ) ) {
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.' ) );
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 );
if ( empty( $l_arr_Plugin ) ) {
echo json_encode( array( 'error' => 'Error reading Plugin meta information.
URL: ' . $l_str_Url . '
Response: ' . $l_str_Response ) );
exit;
}
$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 );
// return Plugin information as JSON encoded string
echo json_encode(
array(
'error' => '',
'PluginDescription' => array_key_exists( 'short_description', $l_arr_Plugin ) ? html_entity_decode( $l_arr_Plugin['short_description'] ) : 'Error reading Plugin information',
'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_Stars >= 0.5 ? 'star-full' : 'star-empty',
'PluginRating2' => $l_int_Stars >= 1.5 ? 'star-full' : 'star-empty',
'PluginRating3' => $l_int_Stars >= 2.5 ? 'star-full' : 'star-empty',
'PluginRating4' => $l_int_Stars >= 3.5 ? 'star-full' : 'star-empty',
'PluginRating5' => $l_int_Stars >= 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'] : '---',
)
);
exit;
}
}