/** * The enhanced default constructor, ends up setting all parameters via the set_ functions * * @param string $title (optional) The title of the breadcrumb * @param string $template (optional) The html template for the breadcrumb * @param string $type (optional) The breadcrumb type * @param string $url (optional) The url the breadcrumb links to */ public function __construct($title = '', $template = '', array $type = array(), $url = '', $id = NULL) { //Filter allowed_html array to allow others to add acceptable tags $this->allowed_html = apply_filters('bcn_allowed_html', wp_kses_allowed_html('post')); //The breadcrumb type $this->type = $type; //Set the resource id $this->set_id($id); //Set the title $this->set_title($title); //Set the default anchorless templates value $this->template_no_anchor = bcn_breadcrumb::default_template_no_anchor; //If we didn't get a good template, use a default template if ($template == NULL) { $this->set_template(bcn_breadcrumb::get_default_template()); } else { //Loose comparison, evaluates to true if URL is '' or NULL if ($url == NULL) { $this->template_no_anchor = wp_kses(apply_filters('bcn_breadcrumb_template_no_anchor', $template, $this->type, $this->id), $this->allowed_html); $this->set_template(bcn_breadcrumb::get_default_template()); } else { $this->set_template($template); } } //Always NULL if unlinked $this->set_url($url); }
/** * Outputs the breadcrumb trail * * @since 3.2.0 * @param (bool) $return Whether to return or echo the trail. * @param (bool) $linked Whether to allow hyperlinks in the trail or not. * @param (bool) $reverse Whether to reverse the output or not. */ function display_list($return = false, $linked = true, $reverse = false) { //Grab the current settings from the db $this->breadcrumb_trail->opt = $this->get_option('bcn_options'); //Generate the breadcrumb trail $this->breadcrumb_trail->fill(); return $this->breadcrumb_trail->display_list($return, $linked, $reverse); }
public function __construct() { //@see https://core.trac.wordpress.org/ticket/10527 if (!is_textdomain_loaded('breadcrumb-navxt')) { load_plugin_textdomain('breadcrumb-navxt', false, 'breadcrumb-navxt/languages'); } $this->trail =& $this->breadcrumbs; //Initilize with default option values $this->opt = array('bmainsite_display' => true, 'Hmainsite_template' => bcn_breadcrumb::get_default_template(), 'Hmainsite_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'bhome_display' => true, 'Hhome_template' => bcn_breadcrumb::get_default_template(), 'Hhome_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'bblog_display' => true, 'Hblog_template' => bcn_breadcrumb::get_default_template(), 'Hblog_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'hseparator' => ' > ', 'blimit_title' => false, 'amax_title_length' => 20, 'bcurrent_item_linked' => false, 'Hpost_page_template' => bcn_breadcrumb::get_default_template(), 'Hpost_page_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'apost_page_root' => get_option('page_on_front'), 'Hpaged_template' => __('<span property="itemListElement" typeof="ListItem"><span property="name">Page %htitle%</span><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'bpaged_display' => false, 'Hpost_post_template' => bcn_breadcrumb::get_default_template(), 'Hpost_post_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'apost_post_root' => get_option('page_for_posts'), 'bpost_post_taxonomy_display' => true, 'Spost_post_taxonomy_type' => 'category', 'Hpost_attachment_template' => bcn_breadcrumb::get_default_template(), 'Hpost_attachment_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'H404_template' => bcn_breadcrumb::default_template_no_anchor, 'S404_title' => __('404', 'breadcrumb-navxt'), 'Hsearch_template' => __('<span property="itemListElement" typeof="ListItem"><span property="name">Search results for '<a property="item" typeof="WebPage" title="Go to the first page of search results for %title%." href="%link%" class="%type%">%htitle%</a>'</span><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'Hsearch_template_no_anchor' => __('<span property="itemListElement" typeof="ListItem"><span property="name">Search results for '%htitle%'</span><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'Htax_post_tag_template' => __('<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" title="Go to the %title% tag archives." href="%link%" class="%type%"><span property="name">%htitle%</span></a><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'Htax_post_tag_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'Htax_post_format_template' => __('<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" title="Go to the %title% archives." href="%link%" class="%type%"><span property="name">%htitle%</span></a><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'Htax_post_format_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'Hauthor_template' => __('<span property="itemListElement" typeof="ListItem"><span property="name">Articles by: <a title="Go to the first page of posts by %title%." href="%link%" class="%type%">%htitle%</a>', 'breadcrumb-navxt'), 'Hauthor_template_no_anchor' => __('<span property="itemListElement" typeof="ListItem"><span property="name">Articles by: %htitle%</span><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'Sauthor_name' => 'display_name', 'Htax_category_template' => __('<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" title="Go to the %title% category archives." href="%link%" class="%type%"><span property="name">%htitle%</span></a><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'Htax_category_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor, 'Hdate_template' => __('<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" title="Go to the %title% archives." href="%link%" class="%type%"><span property="name">%htitle%</span></a><meta property="position" content="%position%"></span>', 'breadcrumb-navxt'), 'Hdate_template_no_anchor' => bcn_breadcrumb::default_template_no_anchor); }
/** * Outputs the breadcrumb trail * * @since 3.8.0 * @param bool $return Whether to return data or to echo it. * @param bool $linked[optional] Whether to allow hyperlinks in the trail or not. * @param string $tag[optional] The tag to use for the nesting * @param string $mode[optional] Whether to follow the rdfa or Microdata format */ function display_nested($return = false, $linked = true, $tag = 'span', $mode = 'rdfa') { //First make sure our defaults are safe $this->find_posttypes($this->breadcrumb_trail->opt); $this->find_taxonomies($this->breadcrumb_trail->opt); //Grab the current settings from the db $this->breadcrumb_trail->opt = wp_parse_args($this->get_option('bcn_options'), $this->breadcrumb_trail->opt); //Generate the breadcrumb trail $this->breadcrumb_trail->fill(); return $this->breadcrumb_trail->display_nested($return, $linked, $tag, $mode); }
/** * widget * * The sidebar widget */ function widget($args) { extract($args); //Manditory before widget junk echo $before_widget; //Display the breadcrumb trial if ($this->breadcrumb_trail->trail[0] != NULL) { $this->breadcrumb_trail->display(); } else { $this->display(); } //Manditory after widget junk echo $after_widget; }
/** * Places settings into $opts array, if missing, for the registered post types * * @param array $opts */ static function find_posttypes(&$opts) { global $wp_post_types, $wp_taxonomies; //Loop through all of the post types in the array foreach ($wp_post_types as $post_type) { //We only want custom post types if (!$post_type->_builtin) { //If the post type does not have settings in the options array yet, we need to load some defaults if (!isset($opts['Hpost_' . $post_type->name . '_template']) || !$post_type->hierarchical && !isset($opts['Spost_' . $post_type->name . '_taxonomy_type'])) { //Add the necessary option array members $opts['Hpost_' . $post_type->name . '_template'] = bcn_breadcrumb::get_default_template(); $opts['Hpost_' . $post_type->name . '_template_no_anchor'] = bcn_breadcrumb::default_template_no_anchor; if ($post_type->has_archive == true || is_string($post_type->has_archive)) { $opts['bpost_' . $post_type->name . '_archive_display'] = true; } else { $opts['bpost_' . $post_type->name . '_archive_display'] = false; } //Default to not showing a post_root $opts['apost_' . $post_type->name . '_root'] = 0; //Default to not displaying a taxonomy $opts['bpost_' . $post_type->name . '_taxonomy_display'] = false; //Loop through all of the possible taxonomies foreach ($wp_taxonomies as $taxonomy) { //Check for non-public taxonomies if (!apply_filters('bcn_show_tax_private', $taxonomy->public, $taxonomy->name)) { continue; } //Activate the first taxonomy valid for this post type and exit the loop if ($taxonomy->object_type == $post_type->name || in_array($post_type->name, $taxonomy->object_type)) { $opts['bpost_' . $post_type->name . '_taxonomy_display'] = true; $opts['Spost_' . $post_type->name . '_taxonomy_type'] = $taxonomy->name; break; } } //If there are no valid taxonomies for this type, we default to not displaying taxonomies for this post type if (!isset($opts['Spost_' . $post_type->name . '_taxonomy_type'])) { $opts['Spost_' . $post_type->name . '_taxonomy_type'] = 'date'; } } } } }
/** * 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'] = get_option('page_on_front'); $opts['post_post_root'] = 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; } else { if (strpos($option, 'anchor') > 0) { $parts = explode('_', $option); //Do excess slash removal sanitation $this->breadcrumb_trail->opt['H' . $parts[0] . '_template'] = $value . '%htitle%</a>'; } else { if ($option == 'max_title_length' || $option == 'post_post_root' || $option == 'post_page_root') { $this->breadcrumb_trail->opt['a' . $option] = $value; } 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 '<a title="Go to the first page of search results for %title%." href="%link%" class="%type%">%htitle%</a>'' || $opts['Hsearch_template'] === 'Search results for '<a title="Go to the first page of search results for %title%." href="%link%" class="%type%">%htitle%</a>'') { $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: <a title="Go to the first page of posts by %title%." href="%link%" class="%type%">%htitle%</a>') { $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; } } } } //S //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 = $opts; //End with resetting up the options breadcrumb_navxt::setup_options($this->opt); }