' . __('Your PHP version is too old, please upgrade to a newer version. Your version is %1$s, Breadcrumb NavXT requires %2$s', 'breadcrumb-navxt') . '
', phpversion(), '5.3.0'); } //If we are in the admin, let's print a warning then return if(is_admin()) { add_action('admin_notices', 'bcn_phpold'); } return; } //Include admin base class if(!class_exists('mtekk_adminKit')) { require_once(dirname(__FILE__) . '/includes/class.mtekk_adminkit.php'); } /** * The administrative interface class * */ class bcn_admin extends mtekk_adminKit { const version = '6.6.0'; protected $full_name = 'Breadcrumb NavXT Settings'; protected $short_name = 'Breadcrumb NavXT'; protected $access_level = 'bcn_manage_options'; protected $identifier = 'breadcrumb-navxt'; protected $unique_prefix = 'bcn'; protected $plugin_basename = null; protected $support_url = 'https://wordpress.org/support/plugin/breadcrumb-navxt/'; protected $breadcrumb_trail = null; /** * Administrative interface class default constructor * * @param bcn_breadcrumb_trail $breadcrumb_trail a breadcrumb trail object * @param string $basename The basename of the plugin */ function __construct(bcn_breadcrumb_trail &$breadcrumb_trail, $basename) { $this->breadcrumb_trail =& $breadcrumb_trail; $this->plugin_basename = $basename; $this->full_name = esc_html__('Breadcrumb NavXT Settings', 'breadcrumb-navxt'); //Grab defaults from the breadcrumb_trail object $this->opt =& $this->breadcrumb_trail->opt; //We're going to make sure we load the parent's constructor parent::__construct(); } /** * admin initialization callback function * * is bound to wordpress action 'admin_init' on instantiation * * @since 3.2.0 * @return void */ function init() { //We're going to make sure we run the parent's version of this function as well parent::init(); } function wp_loaded() { parent::wp_loaded(); breadcrumb_navxt::setup_options($this->opt); } /** * Sets hard constants into the options array * * @param &$opts The options array to set hard constants into */ function opts_fix(&$opts) { $opts['bpost_page_hierarchy_display'] = true; $opts['Spost_page_hierarchy_type'] = 'BCN_POST_PARENT'; $opts['apost_page_root'] = get_option('page_on_front'); } /** * Upgrades input options array, sets to $this->opt * * @param array $opts * @param string $version the version of the passed in options */ function opts_upgrade($opts, $version) { global $wp_post_types, $wp_taxonomies; //If our version is not the same as in the db, time to update if(version_compare($version, $this::version, '<')) { //Upgrading to 3.8.1 if(version_compare($version, '3.8.1', '<')) { $opts['post_page_root'] = $this->get_option('page_on_front'); $opts['post_post_root'] = $this->get_option('page_for_posts'); } //Upgrading to 4.0 if(version_compare($version, '4.0.0', '<')) { //Only migrate if we haven't migrated yet if(isset($opts['current_item_linked'])) { //Loop through the old options, migrate some of them foreach($opts as $option => $value) { //Handle all of our boolean options first, they're real easy, just add a 'b' if(strpos($option, 'display') > 0 || $option == 'current_item_linked') { $this->breadcrumb_trail->opt['b' . $option] = $value; } //Handle migration of anchor templates to the templates else if(strpos($option, 'anchor') > 0) { $parts = explode('_', $option); //Do excess slash removal sanitation $this->breadcrumb_trail->opt['H' . $parts[0] . '_template'] = $value . '%htitle%'; } //Handle our abs integers else if($option == 'max_title_length' || $option == 'post_post_root' || $option == 'post_page_root') { $this->breadcrumb_trail->opt['a' . $option] = $value; } //Now everything else, minus prefix and suffix else if(strpos($option, 'prefix') === false && strpos($option, 'suffix') === false) { $this->breadcrumb_trail->opt['S' . $option] = $value; } } } //Add in the new settings for CPTs introduced in 4.0 foreach($wp_post_types as $post_type) { //We only want custom post types if(!$post_type->_builtin) { //Add in the archive_display option $this->breadcrumb_trail->opt['bpost_' . $post_type->name . '_archive_display'] = $post_type->has_archive; } } $opts = $this->breadcrumb_trail->opt; } if(version_compare($version, '4.0.1', '<')) { if(isset($opts['Hcurrent_item_template_no_anchor'])) { unset($opts['Hcurrent_item_template_no_anchor']); } if(isset($opts['Hcurrent_item_template'])) { unset($opts['Hcurrent_item_template']); } } //Upgrading to 4.3.0 if(version_compare($version, '4.3.0', '<')) { //Removed home_title if(isset($opts['Shome_title'])) { unset($opts['Shome_title']); } //Removed mainsite_title if(isset($opts['Smainsite_title'])) { unset($opts['Smainsite_title']); } } //Upgrading to 5.1.0 if(version_compare($version, '5.1.0', '<')) { foreach($wp_taxonomies as $taxonomy) { //If we have the old options style for it, update if($taxonomy->name !== 'post_format' && isset($opts['H' . $taxonomy->name . '_template'])) { //Migrate to the new setting name $opts['Htax_' . $taxonomy->name . '_template'] = $opts['H' . $taxonomy->name . '_template']; $opts['Htax_' . $taxonomy->name . '_template_no_anchor'] = $opts['H' . $taxonomy->name . '_template_no_anchor']; //Clean up old settings unset($opts['H' . $taxonomy->name . '_template']); unset($opts['H' . $taxonomy->name . '_template_no_anchor']); } } } //Upgrading to 5.4.0 if(version_compare($version, '5.4.0', '<')) { //Migrate users to schema.org breadcrumbs for author and search if still on the defaults for posts if($opts['Hpost_post_template'] === bcn_breadcrumb::get_default_template() && $opts['Hpost_post_template_no_anchor'] === bcn_breadcrumb::default_template_no_anchor) { if($opts['Hpaged_template'] === 'Page %htitle%') { $opts['Hpaged_template'] = $this->opt['Hpaged_template']; } if($opts['Hsearch_template'] === 'Search results for '%htitle%'' || $opts['Hsearch_template'] === 'Search results for '%htitle%'') { $opts['Hsearch_template'] = $this->opt['Hsearch_template']; } if($opts['Hsearch_template_no_anchor'] === 'Search results for '%htitle%'' || $opts['Hsearch_template_no_anchor'] === 'Search results for '%htitle%'') { $opts['Hsearch_template_no_anchor'] = $this->opt['Hsearch_template_no_anchor']; } if($opts['Hauthor_template'] === 'Articles by: %htitle%') { $opts['Hauthor_template'] = $this->opt['Hauthor_template']; } if($opts['Hauthor_template_no_anchor'] === 'Articles by: %htitle%') { $opts['Hauthor_template_no_anchor'] = $this->opt['Hauthor_template_no_anchor']; } } } //Upgrading to 5.5.0 if(version_compare($version, '5.5.0', '<')) { //Translate the old 'page' taxonomy type to BCN_POST_PARENT if($this->opt['Spost_post_taxonomy_type'] === 'page') { $this->opt['Spost_post_taxonomy_type'] = 'BCN_POST_PARENT'; } if(!isset($this->opt['Spost_post_taxonomy_referer'])) { $this->opt['bpost_post_taxonomy_referer'] = false; } //Loop through all of the post types in the array foreach($wp_post_types as $post_type) { //Check for non-public CPTs if(!apply_filters('bcn_show_cpt_private', $post_type->public, $post_type->name)) { continue; } //We only want custom post types if(!$post_type->_builtin) { //Translate the old 'page' taxonomy type to BCN_POST_PARENT if($this->opt['Spost_' . $post_type->name . '_taxonomy_type'] === 'page') { $this->opt['Spost_' . $post_type->name . '_taxonomy_type'] = 'BCN_POST_PARENT'; } //Translate the old 'date' taxonomy type to BCN_DATE if($this->opt['Spost_' . $post_type->name . '_taxonomy_type'] === 'date') { $this->opt['Spost_' . $post_type->name . '_taxonomy_type'] = 'BCN_DATE'; } if(!isset($this->opt['Spost_' . $post_type->name . '_taxonomy_referer'])) { $this->opt['bpost_' . $post_type->name . '_taxonomy_referer'] = false; } } } } //Upgrading to 6.0.0 if(version_compare($version, '6.0.0', '<')) { //Loop through all of the post types in the array foreach($wp_post_types as $post_type) { if(isset($this->opt['Spost_' . $post_type->name . '_taxonomy_type'])) { $this->opt['Spost_' . $post_type->name . '_hierarchy_type'] = $this->opt['Spost_' . $post_type->name . '_taxonomy_type']; unset($this->opt['Spost_' . $post_type->name . '_taxonomy_type']); } if(isset($this->opt['Spost_' . $post_type->name . '_taxonomy_display'])) { $this->opt['Spost_' . $post_type->name . '_hierarchy_display'] = $this->opt['Spost_' . $post_type->name . '_taxonomy_display']; unset($this->opt['Spost_' . $post_type->name . '_taxonomy_display']); } } } //Set the max title length to 20 if we are not limiting the title and the length was 0 if(!$opts['blimit_title'] && $opts['amax_title_length'] == 0) { $opts['amax_title_length'] = 20; } } //Save the passed in opts to the object's option array $this->opt = mtekk_adminKit::parse_args($opts, $this->opt); //End with resetting up the options breadcrumb_navxt::setup_options($this->opt); } function opts_update_prebk(&$opts) { //This may no longer be needed breadcrumb_navxt::setup_options($opts); $opts = apply_filters('bcn_opts_update_prebk', $opts); } /** * help action hook function * * @return string * */ function help() { $screen = get_current_screen(); //Exit early if the add_help_tab function doesn't exist if(!method_exists($screen, 'add_help_tab')) { return; } //Add contextual help on current screen if($screen->id == 'settings_page_' . $this->identifier) { $general_tab = '' . esc_html__('Tips for the settings are located below select options.', 'breadcrumb-navxt') . '
' . esc_html__('For the settings on this page to take effect, you must either use the included Breadcrumb NavXT widget, or place either of the code sections below into your theme.', 'breadcrumb-navxt') . '
<div class="breadcrumbs" typeof="BreadcrumbList" vocab="https://schema.org/">' . "
<?php if(function_exists('bcn_display'))
{
bcn_display();
}?>
</div>
" .
'<ol class="breadcrumbs" typeof="BreadcrumbList" vocab="https://schema.org/">'."
<?php if(function_exists('bcn_display_list'))
{
bcn_display_list();
}?>
</ol>
";
$screen->add_help_tab(
array(
'id' => $this->identifier . '-quick-start',
'title' => __('Quick Start', 'breadcrumb-navxt'),
'content' => $quickstart_tab
));
$styling_tab = '' . esc_html__('Using the code from the Quick Start section above, the following CSS can be used as base for styling your breadcrumb trail.', 'breadcrumb-navxt') . '
' . '.breadcrumbs
{
font-size: 1.1em;
color: #fff;
margin: 30px 0 0 10px;
position: relative;
float: left;
}
';
$screen->add_help_tab(
array(
'id' => $this->identifier . '-styling',
'title' => __('Styling', 'breadcrumb-navxt'),
'content' => $styling_tab
));
$screen->add_help_tab(
array(
'id' => $this->identifier . '-import-export-reset',
'title' => __('Import/Export/Reset', 'breadcrumb-navxt'),
'content' => $this->import_form()
));
}
}
/**
* enqueue's the tab style sheet on the settings page
*/
function admin_styles()
{
wp_enqueue_style('mtekk_adminkit_tabs');
}
/**
* enqueue's the tab js and translation js on the settings page
*/
function admin_scripts()
{
//Enqueue ui-tabs
wp_enqueue_script('jquery-ui-tabs');
//Enqueue the admin tabs javascript
wp_enqueue_script('mtekk_adminkit_tabs');
//Load the translations for the tabs
wp_localize_script('mtekk_adminkit_tabs', 'objectL10n', array(
'mtad_uid' => 'bcn_admin',
'mtad_import' => __('Import', 'breadcrumb-navxt'),
'mtad_export' => __('Export', 'breadcrumb-navxt'),
'mtad_reset' => __('Reset', 'breadcrumb-navxt'),
));
//Enqueue the admin enable/disable groups javascript
wp_enqueue_script('mtekk_adminkit_engroups');
}
/**
* A message function that checks for the BCN_SETTINGS_* define statement
*/
function multisite_settings_warn()
{
if(is_multisite())
{
if(defined('BCN_SETTINGS_USE_LOCAL') && BCN_SETTINGS_USE_LOCAL)
{
}
else if(defined('BCN_SETTINGS_USE_NETWORK') && BCN_SETTINGS_USE_NETWORK)
{
$this->messages[] = new mtekk_adminKit_message(esc_html__('Warning: Your network settings will override any settings set in this page.', 'breadcrumb-navxt'), 'warning', true, $this->unique_prefix . '_msg_is_nsiteoveride');
}
else if(defined('BCN_SETTINGS_FAVOR_LOCAL') && BCN_SETTINGS_FAVOR_LOCAL)
{
$this->messages[] = new mtekk_adminKit_message(esc_html__('Warning: Your network settings may override any settings set in this page.', 'breadcrumb-navxt'), 'warning', true, $this->unique_prefix . '_msg_is_isitemayoveride');
}
else if(defined('BCN_SETTINGS_FAVOR_NETWORK') && BCN_SETTINGS_FAVOR_NETWORK)
{
$this->messages[] = new mtekk_adminKit_message(esc_html__('Warning: Your network settings may override any settings set in this page.', 'breadcrumb-navxt'), 'warning', true, $this->unique_prefix . '_msg_is_nsitemayoveride');
}
//Fall through if no settings mode was set
else
{
$this->messages[] = new mtekk_adminKit_message(esc_html__('Warning: No BCN_SETTINGS_* define statement found, defaulting to BCN_SETTINGS_USE_LOCAL.', 'breadcrumb-navxt'), 'warning', true, $this->unique_prefix . '_msg_is_nosetting');
}
}
}
/**
* A message function that checks for deprecated settings that are set and warns the user
*/
function deprecated_settings_warn()
{
//We're deprecating the limit title length setting, let the user know the new method of accomplishing this
if(isset($this->opt['blimit_title']) && $this->opt['blimit_title'])
{
$this->messages[] = new mtekk_adminKit_message(sprintf(esc_html__('Warning: Your are using a deprecated setting "Title Length" (see Miscellaneous > Deprecated), please %1$suse CSS instead%2$s.', 'breadcrumb-navxt'), '', ''), 'warning');
}
}
/**
* Function checks the current site to see if the blog options should be disabled
*
* @return boool Whether or not the blog options should be disabled
*/
function maybe_disable_blog_options()
{
return (get_option('show_on_front') !== 'page' || get_option('page_for_posts') < 1);
}
/**
* Function checks the current site to see if the mainsite options should be disabled
*
* @return bool Whether or not the mainsite options should be disabled
*/
function maybe_disable_mainsite_options()
{
return !is_multisite();
}
/**
* The administrative page for Breadcrumb NavXT
*/
function admin_page()
{
global $wp_taxonomies, $wp_post_types;
$this->security();
//Do a check on deprecated settings
$this->deprecated_settings_warn();
//Do a check for multisite settings mode
$this->multisite_settings_warn();
do_action($this->unique_prefix . '_settings_pre_messages', $this->opt);
//Display our messages
$this->messages();
?>