/** ==================================================================================================================================================== * The admin configuration page * This function will be called when you select the plugin in the admin backend * * @return void */ public function configuration_page() { global $wpdb; global $blog_id; $table_name = $wpdb->prefix . $this->pluginID; SLFramework_Debug::log(get_class(), "Display the configuration page", 4); ?> <div class="plugin-titleSL"> <h2><?php echo $this->pluginName; ?> </h2> </div> <div class="plugin-contentSL"> <?php echo $this->signature; ?> <p><?php echo __('This plugin enables scheduled backups of important parts of your website!', $this->pluginID); ?> </p> <p><?php echo __('Just configure the schedule and the content to be save and enjoy: a background process will be triggered by the person who visits your website!', $this->pluginID); ?> </p> <?php // On verifie que les droits sont corrects $this->check_folder_rights(array(array(WP_CONTENT_DIR . "/sedlex/backup-scheduler/", "rw"))); // On verifie que la fonction exist if (!@function_exists('gzcompress')) { SLFramework_Debug::log(get_class(), "GZCompress function is not supported on this server.", 1); echo "<div class='error fade'><p>" . sprintf(__('Sorry, but you should install/activate %s on your website. Otherwise, this plugin will not work properly!', $this->pluginID), "<code>gzcompress()</code>") . "</p><div>"; } //========================================================================================== // // Mise en place du systeme d'onglet // //========================================================================================== $tabs = new SLFramework_Tabs(); ob_start(); $upload_dir = wp_upload_dir(); $upload_dir = $upload_dir['basedir'] . "/"; $params = new SLFramework_Parameters($this); $params->add_title(__('How often do you want to backup your website?', $this->pluginID)); $params->add_param('frequency', __('Frequency (in days):', $this->pluginID)); $params->add_param('save_time', __('Time of the backups:', $this->pluginID)); $params->add_comment(__('Please note that 0 means midnight, 1 means 1am, 13 means 1pm, etc. The backup will occur at that time (server time) so make sure that your website is not too overloaded at that time.', $this->pluginID)); $params->add_comment(__("Please also note that the backup won't be end exactly at that time. The backup process could take up to 6h especially if you do not have a lot of traffic on your website and/or if the backup is quite huge.", $this->pluginID)); $params->add_param('delete_after', __('Keep the backup files for (in days):', $this->pluginID)); $params->add_param('ftp_mail', __('If you want to be notify when the backup process is finished, please enter your email:', $this->pluginID)); $params->add_title(__('Customize the name of the files?', $this->pluginID)); $params->add_param('add_name', __('Add this string to the name of the files:', $this->pluginID)); $params->add_comment(sprintf(__('The name of the files will be %s.', $this->pluginID), "<code>BackupScheduler<%addname%>_<%date%>_<%random%>.<%extension%></code>")); $params->add_comment(sprintf(__('%s is the string of the present option. You may set this option to %s.', $this->pluginID), "<code><%addname%></code>", "<code>_CustomName</code>")); $params->add_comment(sprintf(__('%s is a random string for security reasons.', $this->pluginID), "<code><%random%></code>")); $params->add_comment(sprintf(__('%s is the extension (i.e. %s).', $this->pluginID), "<code><%extension%></code>", "<code>zip</code>, <code>z01</code>, <code>z02</code>, <code>z03</code>, ...")); $params->add_title(__('What do you want to save?', $this->pluginID)); if (!is_multisite() || is_multisite() && $blog_id == 1) { $params->add_param('save_all', __('All directories (the full Wordpress installation):', $this->pluginID), "", "", array('!save_upload', '!save_upload_all', '!save_theme', '!save_plugin')); $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), ABSPATH)); $params->add_comment(__('Check this option if you want to save everything. Be careful, because the backup could be quite huge!', $this->pluginID)); $params->add_param('save_plugin', __('The plugins directory:', $this->pluginID)); $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), WP_CONTENT_DIR . "/plugins/")); $params->add_comment(__('Check this option if you want to save all plugins that you have installed and that you use on this website.', $this->pluginID)); $params->add_param('save_theme', __('The themes directory:', $this->pluginID)); $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), WP_CONTENT_DIR . "/themes/")); $params->add_comment(__('Check this option if you want to save all themes that you have installed and that you use on this website.', $this->pluginID)); } if (is_multisite() && $blog_id != 1) { $params->add_param('save_upload', __('The upload directory for this blog:', $this->pluginID)); // blogs.dir n'est plus utilisé pour les nouveaux blogs MU if (is_dir(WP_CONTENT_DIR . "/blogs.dir/" . $blog_id)) { $params->add_comment(sprintf(__('(i.e. %s and %s)', $this->pluginID), WP_CONTENT_DIR . "/blogs.dir/" . $blog_id, $upload_dir)); } else { $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), $upload_dir)); } $params->add_comment(__('Check this option if you want to save the images, the files, etc. that you have uploaded on your website to create your articles/posts/pages.', $this->pluginID)); } else { if (is_multisite() && $blog_id == 1) { $params->add_param('save_upload_all', __('All upload directories (for this site and the sub-blogs):', $this->pluginID), "", "", array("!save_upload")); // blogs.dir n'est plus utilisé pour les nouveaux blogs MU if (is_dir(WP_CONTENT_DIR . "/blogs.dir/")) { $params->add_comment(sprintf(__('(i.e. %s and %s)', $this->pluginID), WP_CONTENT_DIR . "/blogs.dir/", $upload_dir)); } else { $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), $upload_dir)); } $params->add_comment(__('Check this option if you want to save the images, the files, etc. that people have uploaded on their websites to create articles/posts/pages.', $this->pluginID)); // blogs.dir n'est plus utilisé pour les nouveaux blogs MU $params->add_param('save_upload', __('The upload directory for the main site:', $this->pluginID)); if (is_dir(WP_CONTENT_DIR . "/blogs.dir/" . $blog_id)) { $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), WP_CONTENT_DIR . "/blogs.dir/" . $blog_id)); } else { $root = scandir($upload_dir); $val_folder = ""; foreach ($root as $value) { if ($value !== "sites" && $value !== "." && $value !== "..") { if ($val_folder != "") { $val_folder .= ","; } $val_folder .= $upload_dir . $value; } } $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), $val_folder)); } $params->add_comment(__('Check this option if you want to save the images, the files, etc. that you have uploaded on your main website to create your articles/posts/pages.', $this->pluginID)); } else { $params->add_param('save_upload', __('The upload directory:', $this->pluginID)); $params->add_comment(sprintf(__('(i.e. %s)', $this->pluginID), $upload_dir)); $params->add_comment(__('Check this option if you want to save the images, the files, etc. that you have uploaded on your website to create your articles/posts/pages.', $this->pluginID)); } } if (is_multisite() && $blog_id != 1) { $params->add_param('save_db', __('The SQL database:', $this->pluginID)); $params->add_comment(__('Check this option if you want to save the text of your posts, your configurations, etc. for this blog', $this->pluginID)); } else { if (is_multisite() && $blog_id == 1) { $params->add_param('save_db_all', __('All SQL databases:', $this->pluginID), "", "", array("!save_db")); $params->add_comment(__('Check this option if you want to save all texts of posts, configurations, etc. for all blogs in this website', $this->pluginID)); $params->add_param('save_db', __('Only your SQL database:', $this->pluginID)); $params->add_comment(__('Check this option if you want to save the text of your posts, your configurations, etc. for the main website', $this->pluginID)); $params->add_param('save_db_diff_blog', __('Save the SQL content of the sub-sites in different files:', $this->pluginID)); } else { $params->add_param('save_db', __('The SQL database:', $this->pluginID)); $params->add_comment(__('Check this option if you want to save the text of your posts, your configurations, etc.', $this->pluginID)); } } $params->add_param('chunk', __('The maximum zip file size (in MB, namely the chunck size):', $this->pluginID)); $params->add_comment(__('Please note that the zip file will be split into multiple files to comply with the maximum file size you have indicated', $this->pluginID)); $params->add_param('exclude_folder', __('Exclude these folders:', $this->pluginID)); $params->add_comment(__('Please enter one name of folder to be excluded per line', $this->pluginID)); $params->add_comment(sprintf(__('By default, the line should exactely match the folder name or the folder path to exclude said folder (for instance %s or %s, to exclude the content folder)', $this->pluginID), "<code>wp-content</code>", "<code>" . WP_CONTENT_DIR . "</code>")); $params->add_comment(sprintf(__('If the line begins with %s, the line will be consider as a regexp (for instance %s, to exclude the content folder)', $this->pluginID), "<code>[regexp]</code>", "<code>[regexp].*\\/wp-content</code>")); $params->add_comment(__('For now, the following folder are exluded (please refresh the page if you just upfdate the options to see the correct list):', $this->pluginID)); $exclu = explode("\n", $this->get_param('exclude_folder')); $exclu = array_map('trim', $exclu); $exclu[] = WP_CONTENT_DIR . "/sedlex"; ob_start(); $this->searchFolder(ABSPATH, $exclu); $params->add_comment(ob_get_clean()); $params->add_title(__('Do you want that the backup is sent by email?', $this->pluginID)); $params->add_param('email_check', __('Send the backup files by email:', $this->pluginID), '', '', array('email', 'rename')); $params->add_param('email', __('If so, please enter your email:', $this->pluginID)); $params->add_param('rename', __('Do you want to add a suffix to sent files:', $this->pluginID)); $params->add_comment(__('This option allows going round the blocking feature of some mail provider that block the mails with zip attachments (like GMail).', $this->pluginID)); $params->add_comment(__('You do not need to fill this field if no mail is to be sent.', $this->pluginID)); $params->add_title(__('Do you want that the backup is stored on a FTP?', $this->pluginID)); if (function_exists("ftp_connect")) { $params->add_param('ftp', __('Save the backup files on a FTP?', $this->pluginID), '', '', array('ftp_host', 'ftp_login', 'ftp_pass', 'ftp_root', 'ftp_port', 'ftp_create_folder')); $params->add_param('ftp_host', __('FTP host:', $this->pluginID)); $params->add_comment(sprintf(__('Should be at the form %s or %s', $this->pluginID), '<code>ftp://domain.tld/root_folder/</code>', '<code>ftps://domain.tld/root_folder/</code>')); $params->add_comment(sprintf(__('If %s is omitted then it is automatically added when connecting to your FTP. This is useful if you get an 404 error submitting these parameters with %s.', $this->pluginID), '<code>ftp://</code>', '<code>ftp://</code>')); $params->add_param('ftp_port', __('FTP port:', $this->pluginID)); $params->add_comment(sprintf(__('By default the port is %s', $this->pluginID), '<code>21</code>')); $params->add_param('ftp_login', __('Your FTP login:'******'ftp_pass', __('Your FTP pass:'******'Click on that button %s to test if the above information is correct', $this->pluginID) . "<span id='testFTP_info'></span>", "<input type='button' id='testFTP_button' class='button validButton' onClick='testFTP();' value='" . __('Test', $this->pluginID) . "' /><img id='wait_testFTP' src='" . WP_PLUGIN_URL . "/" . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/ajax-loader.gif' style='display: none;'>")); $params->add_param('ftp_create_folder', __('Create sub-folder with date in your FTP repository for all backup files:', $this->pluginID), '', '', array('ftp_prefix_folder')); $params->add_param('ftp_prefix_folder', __('Add a prefix to the created folder:', $this->pluginID)); } else { $params->add_comment(__('Your PHP installation does not support FTP features, thus this option has been disabled! Sorry...', $this->pluginID)); } $params->add_title(__('Advanced - Memory and time management', $this->pluginID)); $params->add_param('max_allocated', __('What is the maximum size of allocated memory (in MB):', $this->pluginID)); $params->add_comment(__("The files greater than this limit won't be included in the zip file!", $this->pluginID)); $params->add_comment(__('On some Wordpress installation, you may have memory issues. Thus, try to reduce this number if you face such error.', $this->pluginID)); $params->add_param('max_time', __('What is the maximum time for the php scripts execution (in seconds):', $this->pluginID)); $params->add_comment(__('Even if you do not have time restriction, it is recommended to set this value to 15sec in order to avoid any killing of the php scripts by your web hoster.', $this->pluginID)); $params->flush(); $parameters = ob_get_clean(); ob_start(); echo "<p>" . __('Here is the backup files. You can force a new backup or download previous backup files.', $this->pluginID) . "</p>"; echo "<p>" . sprintf(__('Please note that the current GMT time of the server is %s. If it is not correct, please configure the Wordpress installation correctly.', $this->pluginID), "<strong>" . date_i18n('Y-m-d H:i:s') . "</strong>") . "</p>"; $hours = $this->backupInHours(); if ($hours > 0) { $days = floor($hours / 24); $hours = $hours - 24 * $days; echo "<p>" . sprintf(__('An automatic backup will be launched in %s days and %s hours.', $this->pluginID), $days, $hours) . "</p>"; } else { echo "<p>" . sprintf(__('The backup process has started %s hours ago but has not finished yet.', $this->pluginID), -$hours) . "</p>"; } echo "<div id='zipfile'>"; $this->displayBackup(); echo "</div>"; echo "<p>"; echo "<img id='wait_backup' src='" . WP_PLUGIN_URL . "/" . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/ajax-loader.gif' style='display: none;'>"; echo " <input type='button' id='backupButton' class='button-primary validButton' onClick='initForceBackup(\"external\")' value='" . __('Force a new backup (with Mail/FTP)', $this->pluginID) . "' />"; echo "<script>jQuery('#backupButton').removeAttr('disabled');</script>"; echo " <input type='button' id='backupButton2' class='button validButton' onClick='initForceBackup(\"internal\")' value='" . __('Force a new backup (without any external storage or sending)', $this->pluginID) . "' />"; echo "<script>jQuery('#backupButton2').removeAttr('disabled');</script>"; echo "</p>"; $tabs->add_tab(__('Backups', $this->pluginID), ob_get_clean()); $tabs->add_tab(__('Parameters', $this->pluginID), $parameters, WP_PLUGIN_URL . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_param.png"); // HOW To ob_start(); echo "<p>" . __("There is two different ways to create a backup:", $this->pluginID) . "</p>"; echo "<ul style='list-style-type: disc;padding-left:40px;'>"; echo "<li><p>" . __("an automatic process (namely background process):", $this->pluginID) . "</p></li>"; echo "<ul style='list-style-type: circle;padding-left:40px;'>"; echo "<li><p>" . __("Every time a user visits a page of the frontside of your website, a small portion of the backup process is performed;", $this->pluginID) . "</p></li>"; echo "<li><p>" . __("Note that if you have very few visits, a complete backup may be quite long.", $this->pluginID) . "</p></li>"; echo "</ul>"; echo "<li><p>" . __("a forced process:", $this->pluginID) . "</p></li>"; echo "<ul style='list-style-type: circle;padding-left:40px;'>"; echo "<li><p>" . __("The button that triggers this forced process may be found in the Backup tab;", $this->pluginID) . "</p></li>"; echo "<li><p>" . __("You have to stay on that page for processing all attachments: if you go on another page (or if you reload the page), the process will be stopped.", $this->pluginID) . "</p></li>"; echo "</ul>"; echo "</ul>"; $howto1 = new SLFramework_Box(__("How to backup the site?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __("When forcing a backup process, the plugin indicates that another process is running.", $this->pluginID) . "</p>"; echo "<p>" . __("99% of the time, it means that the memory limit and/or the chunck size have been increased and that you exceed the maximum memory limit authorized by your server: therefore, the PHP process related to the backup is killed.", $this->pluginID) . "</p>"; echo "<p>" . __("Most of the time, this chunk size and memory limit do not have to be higher than 15Mo.", $this->pluginID) . "</p>"; echo "<p><b>" . __("DO NOT contact me before trying to reduce the chunk size and the memory limit: 250Mo is, for instance, often not a good idea...", $this->pluginID) . "</b></p>"; $howto2 = new SLFramework_Box(__("The backup process cannot end", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __("This plugin create a plurality of split zip.", $this->pluginID) . "</p>"; echo "<p>" . __("Indeed, a PHP process is not able, most of the time, to create, manipulate and handle files that exceed a certain amount of data.", $this->pluginID) . "</p>"; echo "<p>" . __("In order to be able to backup websites of a size of a couple gigabytes, the plugin create different files.", $this->pluginID) . "</p>"; $howto3 = new SLFramework_Box(__("Why the plugin creates multi-part zip?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __("To open the backups, you will have to execute the following steps:", $this->pluginID) . "</p>"; echo "<ul style='list-style-type: disc;padding-left:40px;'>"; echo "<li><p>" . __("Save all zip files (i.e. *.zip, *.z01, *.z02, etc.) in a single folder on your hard disk.", $this->pluginID) . "</p></li>"; echo "<li><p>" . __("Unzip these files by using a software that support multi-part zip files (it is often indicated in the readme):", $this->pluginID) . "</p></li>"; echo "<ul style='list-style-type: disc;padding-left:40px;'>"; echo "<li><p>IZArc (Windows)</p></li>"; echo "<li><p>Winzip (Windows)</p></li>"; echo "<li><p>Winrar (Windows)</p></li>"; echo "<li><p>The UnArchiver (MacOS)</p></li>"; echo "<li><p>" . __("Other software may works ... do not hesitate to inform me!", $this->pluginID) . "</p></li>"; echo "</ul>"; echo "</ul>"; $howto4 = new SLFramework_Box(__("How to open the split zip files?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __("No this plugin does not propose a 'one-click restoration'.", $this->pluginID) . "</p>"; echo "<p>" . __("Indeed, how a plugin may restore an installation of Wordpress if Wordpress does not exists (it has to be restored) to run the plugin? I believe I made my point ...", $this->pluginID) . "</p>"; echo "<p>" . __("Keep in mind that the restoration of a website may be a technical and long process (it depends on what you want to restore). For instance, you need to be familiar with manipulating FTP for accessing your website.", $this->pluginID) . "</p>"; $howto5 = new SLFramework_Box(__("One click restoration?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __("In the zip, you will find some sql files.", $this->pluginID) . "</p>"; echo "<p>" . __("You could either:", $this->pluginID) . "</p>"; echo "<ul style='list-style-type: disc;padding-left:40px;'>"; echo "<li><p>" . sprintf(__("Import each file in your new database (for instance, thanks to %s), in the alphabetical order of the files.", $this->pluginID), "phpMyAdmin") . "</p></li>"; echo "<li><p>" . sprintf(__("Concatenate the sql files in one big file and import this latter file in your new database (for instance, thanks to %s).", $this->pluginID), "phpMyAdmin") . "</p></li>"; echo "</ul>"; echo "<p>" . sprintf(__("Please note that if you choose to save the SQL content of the sub-sites in different files, you will also have some %s files (with %s the index of the blog). You can separately handle these files.", $this->pluginID), "<code>blogx.sql</code>", "<code>x</code>") . "</p>"; $howto6 = new SLFramework_Box(__("How to restore the database?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __("If you have backuped the entire website, the restoration is quite simple: you just have to copy the files in the zip files into your webserver.", $this->pluginID) . "</p>"; echo "<p>" . __("If you have backuped only some folders, you will have to execute the following steps:", $this->pluginID) . "</p>"; echo "<ul style='list-style-type: disc;padding-left:40px;'>"; echo "<li><p>" . __("Install a fresh version of Wordpress on your webserver.", $this->pluginID) . "</p></li>"; echo "<li><p>" . sprintf(__("Replace the folders (i.e. %s, %s, and/or %s) of the root of your webserver by the extracted folders.", $this->pluginID), "'<code>plugins</code>'", "'<code>themes</code>'", "'<code>uploads</code>'") . "</p></li>"; echo "<li><p>" . sprintf(__("Replace the %s (at the root of your webserver) with the extracted one.", $this->pluginID), "<code>wp-config.php</code>") . "</p></li>"; echo "</ul>"; echo "<p>" . sprintf(__("Please note that if you choose to save the SQL content of the sub-sites in different files, you will also have some %s files (with %s the index of the blog). You can separately handle these files.", $this->pluginID), "<code>blogx.sql</code>", "<code>x</code>") . "</p>"; $howto7 = new SLFramework_Box(__("How to restore the other files?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . sprintf(__("The backup files are stored in %s.", $this->pluginID), "<code>wp-content/sedlex/backup-scheduler/</code>") . "</p>"; echo "<p>" . __("In addition, the plugin may store the files on a distant FTP.", $this->pluginID) . "</p>"; echo "<p>" . __("Finally, you can configure the plugin to send the backup files by mail but be informed that there is some difficulties with most of mail provider (size issue, extension rejection, etc.).", $this->pluginID) . "</p>"; $howto8 = new SLFramework_Box(__("Where the backup are stored?", $this->pluginID), ob_get_clean()); ob_start(); echo $howto1->flush(); echo $howto8->flush(); echo $howto3->flush(); echo $howto2->flush(); echo $howto4->flush(); echo $howto5->flush(); echo $howto6->flush(); echo $howto7->flush(); $tabs->add_tab(__('How To', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_how.png"); $frmk = new coreSLframework(); if (is_multisite() && $blog_id == 1 || !is_multisite() || $frmk->get_param('global_allow_translation_by_blogs')) { ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Translation($this->pluginID, $plugin); $trans->enable_translation(); $tabs->add_tab(__('Manage translations', $this->pluginID), ob_get_clean(), WP_PLUGIN_URL . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_trad.png"); } ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Feedback($plugin, $this->pluginID); $trans->enable_feedback(); $tabs->add_tab(__('Give feedback', $this->pluginID), ob_get_clean(), WP_PLUGIN_URL . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_mail.png"); ob_start(); // A list of plugin slug to be excluded $exlude = array('wp-pirates-search'); // Replace sedLex by your own author name $trans = new SLFramework_OtherPlugins("sedLex", $exlude); $trans->list_plugins(); $tabs->add_tab(__('Other plugins', $this->pluginID), ob_get_clean(), WP_PLUGIN_URL . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_plug.png"); echo $tabs->flush(); // Before this comment, you may modify whatever you want //=============================================================================================== ?> <?php echo $this->signature; ?> </div> <?php }
/** ==================================================================================================================================================== * The configuration page * * @return void */ function configuration_page() { global $wpdb; $table_name = $this->table_name; ?> <div class="plugin-titleSL"> <h2><?php echo $this->pluginName; ?> </h2> </div> <div class="plugin-contentSL"> <?php echo $this->signature; ?> <!--debut de personnalisation--> <?php // Store the url if the user submit a file... if (isset($_POST['import'])) { if (is_file($_FILES['fileImport']['tmp_name'])) { $lines = @file($_FILES['fileImport']['tmp_name']); $success = true; $nb_import = 0; foreach ($lines as $l) { $element = explode(",", $l); $query = "INSERT INTO " . $this->table_name . " (id_post, nb_hits, short_url, url_externe, comment) VALUES('" . esc_sql($element[0]) . "','" . esc_sql($element[1]) . "','" . esc_sql($element[2]) . "','" . esc_sql($element[3]) . "','" . esc_sql($element[4]) . "');"; if ($wpdb->query($query) === FALSE) { $success = false; } else { $nb_import++; } } if ($success == false) { if ($nb_import == 0) { echo '<div class="error fade"><p>' . __('An error occurs when updating the database.', $this->pluginID) . '</p></div>'; } else { echo '<div class="error fade"><p>' . sprintf(__('An error occurs when updating the database. Nevertheless %s sentences has been imported successfully.', $this->pluginID), $nb_import) . '</p></div>'; } } else { echo '<div class="updated fade"><p>' . sprintf(__('%s short URL have been added to the database.', $this->pluginID), $nb_import) . '</p></div>'; } } } // On verifie que les droits sont corrects $this->check_folder_rights(array()); //========================================================================================== // // Mise en place du systeme d'onglet // (bien mettre a jour les liens contenu dans les <li> qui suivent) // //========================================================================================== $tabs = new SLFramework_Tabs(); // Mise en place de la barre de navigation ob_start(); // on identifie la racine des short links echo '<script language="javascript">var site="' . $this->get_home_url() . '"</script>'; $maxnb = 20; $table = new SLFramework_Table(0, $maxnb, true, true); // on construit le filtre pour la requete $filter = explode(" ", $table->current_filter()); $paged = 1; $result = array(); $nb_url = 0; while (true) { query_posts(array('post_type' => explode(',', $this->get_param('typepage')), 'posts_per_page' => 100, 'paged' => $paged)); $nb_url += 100; if (!have_posts() || $nb_url >= $this->get_param('maxnb')) { break; } $paged++; while (have_posts()) { the_post(); // we check if the title match the filter $match = true; $title = get_the_title(); foreach ($filter as $fi) { if ($fi != "") { if (strpos($title, $fi) === FALSE) { $match = false; break; } } } if ($match) { $result[] = array(get_the_ID(), $title, wp_get_shortlink(), get_post_type(), $wpdb->get_var("SELECT nb_hits FROM {$table_name} WHERE id_post='" . get_the_ID() . "'")); } } } if ($nb_url >= $this->get_param('maxnb')) { echo '<div class="updated">'; echo '<p>' . sprintf(__('The number of displayed URL cannot exceed %s. Thus the number of url is limited to this number.', $this->pluginID), $this->get_param('maxnb')) . '</p>'; echo '</div>'; } $count = count($result); $table->set_nb_all_Items($count); $table->title(array(__('Title of your articles', $this->pluginID), __('Short URL', $this->pluginID), __('Type', $this->pluginID), __('Number of clicks', $this->pluginID))); // We order the posts page according to the choice of the user if ($table->current_orderdir() == "ASC") { $result = SLFramework_Utils::multicolumn_sort($result, $table->current_ordercolumn(), true); } else { $result = SLFramework_Utils::multicolumn_sort($result, $table->current_ordercolumn(), false); } // We limit the result to the requested zone $result = array_slice($result, ($table->current_page() - 1) * $maxnb, $maxnb); // lignes du tableau // boucle sur les differents elements $ligne = 0; foreach ($result as $r) { $ligne++; ob_start(); ?> <b><?php echo $r[1]; ?> </b> <img src="<?php echo plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)); ?> img/ajax-loader.gif" id="wait<?php echo $r[0]; ?> " style="display: none;" /> <?php $cel1 = new adminCell(ob_get_clean()); ob_start(); ?> <span id="lien<?php echo $r[0]; ?> " ><a href="<?php echo $r[2]; ?> "><?php echo $r[2]; ?> </a></span> <?php $cel2 = new adminCell(ob_get_clean()); $cel2->add_action(__("Reset", $this->pluginID), "resetLink"); $cel2->add_action(__("Edit", $this->pluginID), "forceLink"); if (get_post_status($r[0]) == "publish") { $cel3 = new adminCell($r[3]); } else { $cel3 = new adminCell($r[3] . " (" . get_post_status($r[0]) . ")"); } $select = "SELECT nb_hits FROM {$table_name} WHERE id_post='" . $r[0] . "'"; $nb_hits = $wpdb->get_var($select); $cel4 = new adminCell($nb_hits); $table->add_line(array($cel1, $cel2, $cel3, $cel4), $r[0]); } echo $table->flush(); ob_start(); ?> <form method='post' enctype='multipart/form-data' action='<?php echo $_SERVER["REQUEST_URI"]; ?> '> <label for='fileImport'><?php echo __('Select the file:', $this->pluginID); ?> </label> <input name='fileImport' id='fileImport' type='file'/><br/> <div class="submit"> <input type="submit" name="import" class='button-primary validButton' value="<?php echo __('Import a file with shorturls', $this->pluginID); ?> " /> <input type="submit" name="export" class='button-primary validButton' value="<?php echo __('Export the shorturls', $this->pluginID); ?> " /> </div> </form> <?php $box = new SLFramework_Box(__('Import/Export Short URL', $this->pluginID), ob_get_clean()); echo $box->flush(); $tabs->add_tab(__('Internal Redirections', $this->pluginID), ob_get_clean()); ob_start(); if (isset($_POST['add'])) { $url_ext = str_replace("'", "", $_POST['url_externe']); $comment = str_replace("'", "", $_POST['comment']); if (!preg_match("/^http/i", $url_ext)) { $url_ext = "http://" . $url_ext; } $this->add_external_link($url_ext, $comment); } $maxnb = 20; $table = new SLFramework_Table($count, $maxnb, true, true); $table->title(array(__('External URL', $this->pluginID), __('Short URL', $this->pluginID), __('Comment', $this->pluginID), __('Number of clicks', $this->pluginID))); // on construit le filtre pour la requête $filter = explode(" ", $table->current_filter()); $filter_words = ""; foreach ($filter as $fi) { $filter_words .= " AND "; $filter_words .= "(url_externe like '%" . $fi . "%' OR comment like '%" . $fi . "%')"; } $count = $wpdb->get_var("SELECT COUNT(*) FROM " . $table_name . " WHERE id_post=0 " . $filter_words . " AND url_externe<>''; "); $table->set_nb_all_Items($count); if ($table->current_ordercolumn() == 1) { $orderby = " ORDER BY url_externe " . $table->current_orderdir(); } else { if ($table->current_ordercolumn() == 2) { $orderby = " ORDER BY short_url " . $table->current_orderdir(); } else { if ($table->current_ordercolumn() == 3) { $orderby = " ORDER BY nb_hits " . $table->current_orderdir(); } } } $res = $wpdb->get_results("SELECT * FROM " . $table_name . " WHERE id_post=0 " . $filter_words . " AND url_externe<>'' " . $orderby . " LIMIT " . $maxnb * ($table->current_page() - 1) . ", " . $maxnb . " ; "); foreach ($res as $r) { $id_temp = sha1($r->short_url); $cel1 = new adminCell("<a href='" . $r->url_externe . "'>" . $r->url_externe . "</a><img src='" . plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "img/ajax-loader.gif' id='wait_external" . $id_temp . "' style='display: none;' />"); $cel1->add_action(__("Delete", $this->pluginID), "deleteLink_external('" . $id_temp . "')"); $cel2 = new adminCell("<span id='lien_external" . $id_temp . "'><a href='" . $this->get_home_url() . "/" . $r->short_url . "'>" . $this->get_home_url() . "/" . $r->short_url . "</a></span>"); $cel2->add_action(__("Reset", $this->pluginID), "resetLink_external('" . $id_temp . "')"); $cel2->add_action(__("Edit", $this->pluginID), "forceLink_external('" . $id_temp . "')"); $cel3 = new adminCell("<p>" . $r->comment . "</p>"); $cel4 = new adminCell($r->nb_hits); $table->add_line(array($cel1, $cel2, $cel3, $cel4), $id_temp); } echo $table->flush(); ob_start(); ?> <form method='post' action='<?php echo remove_query_arg("filter_" . $table->id, $_SERVER["REQUEST_URI"]); ?> '> <label for='url_externe'><?php echo __('External URL:', $this->pluginID); ?> </label> <input name='url_externe' id='url_externe' type='text' value='' size='40'/><br/> <label for='comment'><?php echo __('Comments:', $this->pluginID); ?> </label> <input name='comment' id='comment' type='text' value='' size='40'/><br/> <div class="submit"> <input type="submit" name="add" class='button-primary validButton' value="<?php echo __('Add a new URL to shorten', $this->pluginID); ?> " /> </div> </form> <?php $box = new SLFramework_Box(__('Add a new URL to shorten', $this->pluginID), ob_get_clean()); echo $box->flush(); ob_start(); ?> <form method='post' enctype='multipart/form-data' action='<?php echo $_SERVER["REQUEST_URI"]; ?> '> <label for='fileImport'><?php echo __('Select the file:', $this->pluginID); ?> </label> <input name='fileImport' id='fileImport' type='file'/><br/> <div class="submit"> <input type="submit" name="import" class='button-primary validButton' value="<?php echo __('Import a file with shorturls', $this->pluginID); ?> " /> <input type="submit" name="export" class='button-primary validButton' value="<?php echo __('Export the shorturls', $this->pluginID); ?> " /> </div> </form> <?php $box = new SLFramework_Box(__('Import/Export Short URL', $this->pluginID), ob_get_clean()); echo $box->flush(); $tabs->add_tab(__('External Redirections', $this->pluginID), ob_get_clean()); // HOW To ob_start(); echo "<p>" . __("This plugin helps you sharing your post with short-links.", $this->pluginID) . "</p>"; $howto1 = new SLFramework_Box(__("Purpose of that plugin", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . sprintf(__('When the function %s is called, this plugin replace the normal short links by a special crafted short links.', $this->pluginID), "<code>wp_get_shortlink</code>") . "</p>"; echo "<p>" . sprintf(__('The short URL may be for instance %s of %s (the length of the short link may be configured).', $this->pluginID), "<code>http://domain.tld/Fh67aa</code>", "<code>http://domain.tld/ZhbaG</code>") . "</p>"; echo "<p>" . __('.', $this->pluginID) . "</p>"; $howto2 = new SLFramework_Box(__("How it works?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __('To display the shorten URL, you just have to choose the position of the display (top, bottom, etc.) in the configuration tab.', $this->pluginID) . "</p>"; echo "<p>" . sprintf(__('You may also display the shorten URL whereever you want by using the %s function (for instance in your theme).', $this->pluginID), "<code>wp_get_shortlink</code>", "<code>http://domain.tld/ZhbaG</code>") . "</p>"; $howto3 = new SLFramework_Box(__("How to display the short URL?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __('When your server see the request short URL, it will automatically redirect to the normal page.', $this->pluginID) . "</p>"; echo "<p>" . __('You may also choose to redirect the short URL through an internal page:', $this->pluginID) . "</p>"; echo "<ul style='list-style-type: disc;padding-left:40px;'>"; echo "<li><p>" . __("You just have to choose a specially crafted page to display during the redirection;", $this->pluginID) . "</p></li>"; echo "<li><p>" . sprintf(__("In the page, you may insert %s to display the number of seconds remaining;", $this->pluginID), "<code>[short_url_second]</code>") . "</p></li>"; echo "<li><p>" . sprintf(__("You may also insert %s to display the URL of the page to where the redirection will be performed;", $this->pluginID), "<code>[short_url_url]</code>") . "</p></li>"; echo "</ul>"; $howto4 = new SLFramework_Box(__("How to redirect works?", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . sprintf(__('Your WP install should not use default permalinks (i.e. %s) but instead any custom permalinks (i.e. %s or %s).', $this->pluginID), "<code>http://domain.tld/?p=453</code>", "<code>domain.tld/2015/02/12/sample-post/</code>", "<code>domain.tld/2015/sample-post/</code>") . "</p>"; $howto5 = new SLFramework_Box(__("Requirements", $this->pluginID), ob_get_clean()); ob_start(); echo $howto1->flush(); echo $howto2->flush(); echo $howto3->flush(); echo $howto4->flush(); echo $howto5->flush(); $tabs->add_tab(__('How To', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_how.png"); ob_start(); ?> <h3 class="hide-if-js"><?php echo __('Parameters', $this->pluginID); ?> </h3> <?php $params = new SLFramework_Parameters($this, 'tab-parameters'); $params->add_title(__('Do you want to use the following characters?', $this->pluginID)); $params->add_comment(__('These parameters will be taken in account only for generation of new links', $this->pluginID)); $params->add_param('low_char', __('Lower-case characters ([a-z]):', $this->pluginID)); $params->add_param('upp_char', __('Upper-case characters ([A-Z]):', $this->pluginID)); $params->add_param('num_char', __('Numeric characters ([0-9]):', $this->pluginID)); $params->add_title(__('Do you want to use a prefix before your short URL?', $this->pluginID)); $params->add_param('prefix', __('Prefix:', $this->pluginID), "@[^a-zA-Z0-9_]@"); $params->add_title(__('What is the length of your short URL (without the prefix)?', $this->pluginID)); $params->add_param('length', __('Length:', $this->pluginID)); $params->add_title(__('What are the short links that are to be displayed?', $this->pluginID)); $params->add_param('typepage', __('Types (separated with comma):', $this->pluginID)); $args = array('public' => true); $output = 'names'; // names or objects, note names is the default $operator = 'and'; // 'and' or 'or' $post_types = get_post_types($args, $output, $operator); $exemple = "page,post"; foreach ($post_types as $post_type) { $exemple .= "," . $post_type; } $params->add_comment(sprintf(__('For instance %s', $this->pluginID), "<code>" . $exemple . "</code>")); $params->add_comment(__('Note that ALL page will be shorten, but only this types will be displayed in the first tab of this plugin.', $this->pluginID)); $params->add_title(__('Customize the short link URL', $this->pluginID)); $params->add_param('removewww', __('Remove www:', $this->pluginID)); $params->add_comment(sprintf(__('Therefore, the short URL will begin with %s', $this->pluginID), str_replace("://www.", "://", home_url()))); $params->add_param('changeroot', __('Change the root URL of the short link:', $this->pluginID), "", "", array("!removewww", "changeroot_url")); $params->add_comment(__('If you have a shorter URL pointing to your Wordpress blog, you may configure it here by selecting this option', $this->pluginID)); $params->add_param('changeroot_url', __('Your shorter domain URL:', $this->pluginID)); $params->add_title(__('Do you want to automatically shorten links in article?', $this->pluginID)); $params->add_param('catch_url', __('Automatic shorten links:', $this->pluginID), "", "", array('catch_url_filter')); $params->add_param('catch_url_filter', __('Regexp filter:', $this->pluginID)); $params->add_comment(sprintf(__('The above regexp filter is to select the page in which the link urls are shorten. For instance, %s (or %s) configures the plugin to shorten all links, for instance, in pages %s and %s', $this->pluginID), "<code>.*cat_select.*</code>", "<code>cat_select</code>", "<code>http://domain.tld/cat_select/</code>", "<code>http://domain.tld/level/cat_select/child/</code>")); $params->add_comment(__('Please enter one regexp per line.', $this->pluginID)); $params->add_comment(__('If no regexp is entered, links in all pages and posts will be shorten.', $this->pluginID)); $params->add_title(__('Where to display the short URL?', $this->pluginID)); $params->add_param('display_top_in_post', "" . __('At the top of posts:', $this->pluginID)); $params->add_param('display_bottom_in_post', "" . __('At the bottom of posts:', $this->pluginID)); $params->add_param('display_top_in_page', "" . __('At the top of pages:', $this->pluginID)); $params->add_param('display_bottom_in_page', "" . __('At the bottom of pages:', $this->pluginID)); $params->add_param('display_top_in_custom', "" . __('At the top of custom type article:', $this->pluginID)); $params->add_param('display_bottom_in_custom', "" . __('At the bottom of custom type article:', $this->pluginID)); $params->add_param('display_top_in_excerpt', "" . __('At the top of excerpt:', $this->pluginID)); $params->add_param('display_bottom_in_excerpt', "" . __('At the bottom of excerpt:', $this->pluginID)); $params->add_param('exclude', __('Page to be excluded:', $this->pluginID)); $params->add_comment(sprintf(__("Please enter one entry per line. If the article %s is to be excluded, you may enter %s.", $this->pluginID), "<code>http://yourdomain.tld/contact/</code>", "<code>contact</code>")); $params->add_comment(sprintf(__("For instance, %s and %s will exclude the home page.", $this->pluginID), "<code>^\$</code>", "<code>^/\$</code>")); $params->add_title(__('Appearance of such display', $this->pluginID)); $params->add_param('html', __('Displayed HTML:', $this->pluginID)); $params->add_comment_default_value('html'); $params->add_comment(sprintf(__('Note that %s will be automatically replaced by the shorten URL.', $this->pluginID), "<code>%short_url%</code>")); $params->add_comment(sprintf(__('In addition, %s will be replaced by the shorten URL withour any html link.', $this->pluginID), "<code>%short_url_without_link%</code>")); $params->add_param('css', __('CSS:', $this->pluginID)); $params->add_comment_default_value('css'); $params->add_title(__('Redirect first internally', $this->pluginID)); $params->add_param('redirect_page', __('Redirect the short link before to an internal page:', $this->pluginID)); $params->add_param('redirect_sec', __('Number of second before the redirection:', $this->pluginID)); $params->add_param('redirect_only_external', __('Redirect through this internal page only the external redirection:', $this->pluginID)); $params->add_title(__('Advanced options', $this->pluginID)); $params->add_param('maxnb', __('Max number of displayed internal redirection:', $this->pluginID)); $params->flush(); $tabs->add_tab(__('Parameters', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_param.png"); ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Translation($this->pluginID, $plugin); $trans->enable_translation(); $tabs->add_tab(__('Manage translations', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_trad.png"); ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Feedback($plugin, $this->pluginID); $trans->enable_feedback(); $tabs->add_tab(__('Give feedback', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_mail.png"); ob_start(); $trans = new SLFramework_OtherPlugins("sedLex", array('wp-pirates-search')); $trans->list_plugins(); $tabs->add_tab(__('Other plugins', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_plug.png"); echo $tabs->flush(); echo $this->signature; ?> </div> <?php }
/** ==================================================================================================================================================== * The admin configuration page * This function will be called when you select the plugin in the admin backend * * @return void */ public function configuration_page() { global $wpdb; global $blog_id; SLFramework_Debug::log(get_class(), "Print the configuration page.", 4); ?> <div class="plugin-titleSL"> <h2><?php echo $this->pluginName; ?> </h2> </div> <div class="plugin-contentSL"> <?php //=============================================================================================== // After this comment, you may modify whatever you want ?> <p><?php echo __("This is the configuration page of the plugin", $this->pluginID); ?> </p> <?php // We check rights $this->check_folder_rights(array(array(WP_CONTENT_DIR . "/sedlex/test/", "rwx"))); $tabs = new SLFramework_Tabs(); ob_start(); // Examples for creating tables //---------------------------------- echo "<h5>" . __("Tables", $this->pluginID) . "</h5>"; $table = new SLFramework_Table(); $table->title(array(__("Col1", $this->pluginID), __("Col2", $this->pluginID), __("Col2", $this->pluginID))); ob_start(); echo __("Cell 1-1", $this->pluginID); $cel1 = new adminCell(ob_get_clean()); ob_start(); echo __("Cell 1-2", $this->pluginID); $cel2 = new adminCell(ob_get_clean()); ob_start(); echo __("Cell 1-3", $this->pluginID); $cel3 = new adminCell(ob_get_clean()); $table->add_line(array($cel1, $cel2, $cel3), '1'); ob_start(); echo __("Cell 2-1", $this->pluginID); $cel1 = new adminCell(ob_get_clean()); ob_start(); echo __("Cell 2-2", $this->pluginID); $cel2 = new adminCell(ob_get_clean()); ob_start(); echo __("Cell 2-3", $this->pluginID); $cel3 = new adminCell(ob_get_clean()); $table->add_line(array($cel1, $cel2, $cel3), '2'); echo $table->flush(); $tabs->add_tab(__('Summary', $this->pluginID), ob_get_clean()); ob_start(); $params = new SLFramework_Parameters($this, "tab-parameters"); $params->add_title(__('Title 1', $this->pluginID)); $params->add_param('opt1', __('Modify arg 1:', $this->pluginID)); $params->add_comment(__("This is a comment. The default value is:", $this->pluginID)); $params->add_comment_default_value('opt1'); $params->add_param('opt2', __('Modify arg 2:', $this->pluginID)); $params->add_param('opt3', __('Modify arg 3:', $this->pluginID)); $params->add_comment(__('This is another comment.', $this->pluginID)); $params->add_comment(__('The default value is:', $this->pluginID)); $params->add_comment_default_value('opt3'); $params->add_title(__('Title 2', $this->pluginID)); $params->add_param('opt4', __('Modify arg 4:', $this->pluginID)); $params->add_comment(__("This is a comment. The default value is:", $this->pluginID)); $params->add_comment_default_value('opt4'); $params->flush(); $tabs->add_tab(__('Parameters', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_param.png"); $frmk = new coreSLframework(); if (is_multisite() && $blog_id == 1 || !is_multisite() || $frmk->get_param('global_allow_translation_by_blogs')) { ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Translation($this->pluginID, $plugin); $trans->enable_translation(); $tabs->add_tab(__('Manage translations', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_trad.png"); } ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Feedback($plugin, $this->pluginID); $trans->enable_feedback(); $tabs->add_tab(__('Give feedback', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_mail.png"); ob_start(); // A list of plugin slug to be excluded $exlude = array('wp-pirate-search'); // Replace sedLex by your own author name $trans = new SLFramework_OtherPlugins("sedLex", $exlude); $trans->list_plugins(); $tabs->add_tab(__('Other plugins', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_plug.png"); echo $tabs->flush(); // Before this comment, you may modify whatever you want //=============================================================================================== ?> <?php echo $this->signature; ?> </div> <?php }
/** ==================================================================================================================================================== * The admin configuration page * This function will be called when you select the plugin in the admin backend * * @return void */ public function configuration_page() { global $wpdb; global $blog_id; SLFramework_Debug::log(get_class(), "Print the configuration page.", 4); ?> <div class="plugin-titleSL"> <h2><?php echo $this->pluginName; ?> </h2> </div> <div class="plugin-contentSL"> <?php echo $this->signature; ?> <?php //=============================================================================================== // After this comment, you may modify whatever you want // We check rights $this->check_folder_rights(array(array(WP_CONTENT_DIR . "/sedlex/test/", "rwx"))); $tabs = new SLFramework_Tabs(); ob_start(); echo "<p>" . __("In this tab, you could re-order the page hierarchy by 'drag-and-dropping' page entries.", $this->pluginID) . "</p>"; $args = array('sort_order' => 'ASC', 'sort_column' => 'menu_order,post_title', 'parent' => 0, 'child_of' => 0, 'offset' => 0, 'post_type' => 'page', 'post_status' => 'publish,draft,pending,future'); SLFramework_Treelist::render($this->create_hierarchy_pages(get_pages($args)), true, 'savePageHierarchy', 'page_hiera'); $tabs->add_tab(__('Order Pages', $this->pluginID), ob_get_clean()); // HOW To ob_start(); echo "<p>" . __('With this plugin you may order your pages into hierarchical tree and display the tree in them.', $this->pluginID) . "</p>"; echo "<p>" . sprintf(__("To display the tree please add %s in your page.", $this->pluginID), "<code>[page_tree]</code>") . "</p>"; $howto1 = new SLFramework_Box(__("Purpose of that plugin", $this->pluginID), ob_get_clean()); ob_start(); echo "<p>" . __('Just drag and drop each entry.', $this->pluginID) . "</p>"; $howto2 = new SLFramework_Box(__("How to order the page", $this->pluginID), ob_get_clean()); ob_start(); echo $howto1->flush(); echo $howto2->flush(); $tabs->add_tab(__('How To', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_how.png"); ob_start(); $params = new SLFramework_Parameters($this, "tab-parameters"); $params->add_title(__("Tree view style (i.e. [page_tree] shortcode)", $this->pluginID)); $params->add_param('current_style', __("Set the style of current page in tree:", $this->pluginID)); $params->add_param('parent_style', __("Set the style of parent pages in tree:", $this->pluginID)); $params->add_param('child_style', __("Set the style of child pages in tree:", $this->pluginID)); $params->add_param('other_style', __("Set the style of other pages in tree:", $this->pluginID)); $params->add_title(__("Breadcrumb style (i.e. [page_parents] shortcode)", $this->pluginID)); $params->add_param('breadcrumb_all', __("Set the style of the breadcrumb:", $this->pluginID)); $params->add_param('breadcrumb_item', __("Set the style of items of the breadcrumb:", $this->pluginID)); $params->add_title(__("Order for editor", $this->pluginID)); $params->add_param('show_order_in_page_edit', __("Show the order page for the editors users (menu under the page menu):", $this->pluginID)); $params->flush(); $tabs->add_tab(__('Parameters', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_param.png"); $frmk = new coreSLframework(); if (is_multisite() && $blog_id == 1 || !is_multisite() || $frmk->get_param('global_allow_translation_by_blogs')) { ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Translation($this->pluginID, $plugin); $trans->enable_translation(); $tabs->add_tab(__('Manage translations', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_trad.png"); } ob_start(); $plugin = str_replace("/", "", str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); $trans = new SLFramework_Feedback($plugin, $this->pluginID); $trans->enable_feedback(); $tabs->add_tab(__('Give feedback', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_mail.png"); ob_start(); // A liste of plugin slug to be excluded $exlude = array('wp-pirate-search'); // Replace sedLex by your own author name $trans = new SLFramework_OtherPlugins("sedLex", $exlude); $trans->list_plugins(); $tabs->add_tab(__('Other plugins', $this->pluginID), ob_get_clean(), plugin_dir_url("/") . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__)) . "core/img/tab_plug.png"); echo $tabs->flush(); // Before this comment, you may modify whatever you want //=============================================================================================== ?> <?php echo $this->signature; ?> </div> <?php }