/* Copyright 2007-2024 John Havlik (email : john.havlik@mtekk.us) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //Do a PHP version check, require 5.6 or newer if(version_compare(phpversion(), '5.6.0', '<')) { //Only purpose of this function is to echo out the PHP version error function bcn_phpold() { printf('

' . esc_html__('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.6.0'); } //If we are in the admin, let's print a warning then return if(is_admin()) { add_action('admin_notices', 'bcn_phpold'); } return; } require_once(dirname(__FILE__) . '/includes/multibyte_supplicant.php'); //Include admin base class if(!class_exists('\mtekk\adminKit\adminKit')) { require_once(dirname(__FILE__) . '/includes/adminKit/class-mtekk_adminkit.php'); } //Include the breadcrumb class require_once(dirname(__FILE__) . '/class.bcn_breadcrumb.php'); //Include the breadcrumb trail class require_once(dirname(__FILE__) . '/class.bcn_breadcrumb_trail.php'); if(class_exists('WP_Widget')) { //Include the WP 2.8+ widget class require_once(dirname(__FILE__) . '/class.bcn_widget.php'); } use mtekk\adminKit\adminKit as adminKit; use mtekk\adminKit\setting; $breadcrumb_navxt = null; //TODO change to extends \mtekk\plugKit class breadcrumb_navxt { const version = '7.3.0'; protected $name = 'Breadcrumb NavXT'; protected $identifier = 'breadcrumb-navxt'; protected $unique_prefix = 'bcn'; protected $plugin_basename = null; protected $opt = null; protected $settings = array(); protected $breadcrumb_trail = null; protected $admin = null; protected $rest_controller = null; /** * Constructor for a new breadcrumb_navxt object * * @param bcn_breadcrumb_trail $breadcrumb_trail An instance of a bcn_breadcrumb_trail object to use for everything */ public function __construct(bcn_breadcrumb_trail $breadcrumb_trail) { //We get our breadcrumb trail object from our constructor $this->breadcrumb_trail = $breadcrumb_trail; //We set the plugin basename here $this->plugin_basename = plugin_basename(__FILE__); //We need to add in the defaults for CPTs and custom taxonomies after all other plugins are loaded add_action('wp_loaded', array($this, 'wp_loaded'), 15); add_action('rest_api_init', array($this, 'rest_api_init'), 10); //Run much later than everyone else to give other plugins a chance to hook into the filters and actions in this add_action('init', array($this, 'init'), 9000); //Register the WordPress 2.8 Widget add_action('widgets_init', array($this, 'register_widget')); //Load our network admin if in the network dashboard (yes is_network_admin() doesn't exist) if(defined('WP_NETWORK_ADMIN') && WP_NETWORK_ADMIN) { require_once(dirname(__FILE__) . '/class.bcn_network_admin.php'); //Instantiate our new admin object $this->admin = new bcn_network_admin($this->breadcrumb_trail->opt, $this->plugin_basename, $this->settings); } //Load our main admin if in the dashboard, but only if we're not in the network dashboard (prevents goofy bugs) else if(is_admin() || defined('WP_UNINSTALL_PLUGIN')) { require_once(dirname(__FILE__) . '/class.bcn_admin.php'); //Instantiate our new admin object $this->admin = new bcn_admin($this->breadcrumb_trail->opt, $this->plugin_basename, $this->settings); } } public function init() { add_filter('bcn_allowed_html', array($this, 'allowed_html'), 1, 1); add_filter('mtekk_adminkit_allowed_html', array($this, 'adminkit_allowed_html'), 1, 1); //We want to run late for using our breadcrumbs add_filter('tha_breadcrumb_navigation', array($this, 'tha_compat'), 99); //Only include the REST API if enabled if(!defined('BCN_DISABLE_REST_API') || !BCN_DISABLE_REST_API) { require_once(dirname(__FILE__) . '/class.bcn_rest_controller.php'); $this->rest_controller = new bcn_rest_controller($this->breadcrumb_trail, $this->unique_prefix); } breadcrumb_navxt::setup_setting_defaults($this->settings); if(!is_admin() || (!isset($_POST[$this->unique_prefix . '_admin_reset']) && !isset($_POST[$this->unique_prefix . '_admin_options']))) { $this->get_settings(); //This breaks the reset options script, so only do it if we're not trying to reset the settings } //Register Guternberg Block $this->register_block(); } public function rest_api_init() { add_filter('bcn_register_rest_endpoint', array($this, 'api_enable_for_block'), 10, 4); } public function register_widget() { return register_widget($this->unique_prefix . '_widget'); } /** * Handles registering the Breadcrumb Trail Gutenberg block */ public function register_block() { if(function_exists('register_block_type')) { register_block_type( dirname(__FILE__) . '/includes/blocks/build/breadcrumb-trail'); } } public function api_enable_for_block($register_rest_endpoint, $endpoint, $version, $methods) { //Enable if the current user can edit posts if(current_user_can('edit_posts') && $endpoint === 'post') { return true; } return $register_rest_endpoint; } public function adminkit_allowed_html($tags) { //Hoop through normal allowed_html filters return apply_filters('bcn_allowed_html', $tags); } public function allowed_html($tags) { $allowed_html = array( 'a' => array( 'href' => true, 'title' => true, 'class' => true, 'id' => true, 'media' => true, 'dir' => true, 'relList' => true, 'rel' => true, 'aria-hidden' => true, 'data-icon' => true, 'itemref' => true, 'itemid' => true, 'itemprop' => true, 'itemscope' => true, 'itemtype' => true, 'xmlns:v' => true, 'typeof' => true, 'property' => true, 'vocab' => true, 'translate' => true, 'lang' => true, 'bcn-aria-current' => true ), 'img' => array( 'alt' => true, 'align' => true, 'height' => true, 'width' => true, 'src' => true, 'srcset' => true, 'sizes' => true, 'id' => true, 'class' => true, 'aria-hidden' => true, 'data-icon' => true, 'itemref' => true, 'itemid' => true, 'itemprop' => true, 'itemscope' => true, 'itemtype' => true, 'xmlns:v' => true, 'typeof' => true, 'property' => true, 'vocab' => true, 'lang' => true ), 'span' => array( 'title' => true, 'class' => true, 'id' => true, 'dir' => true, 'align' => true, 'lang' => true, 'xml:lang' => true, 'aria-hidden' => true, 'data-icon' => true, 'itemref' => true, 'itemid' => true, 'itemprop' => true, 'itemscope' => true, 'itemtype' => true, 'xmlns:v' => true, 'typeof' => true, 'property' => true, 'vocab' => true, 'translate' => true, 'lang' => true ), 'h1' => array( 'title' => true, 'class' => true, 'id' => true, 'dir' => true, 'align' => true, 'lang' => true, 'xml:lang' => true, 'aria-hidden' => true, 'data-icon' => true, 'itemref' => true, 'itemid' => true, 'itemprop' => true, 'itemscope' => true, 'itemtype' => true, 'xmlns:v' => true, 'typeof' => true, 'property' => true, 'vocab' => true, 'translate' => true, 'lang' => true ), 'h2' => array( 'title' => true, 'class' => true, 'id' => true, 'dir' => true, 'align' => true, 'lang' => true, 'xml:lang' => true, 'aria-hidden' => true, 'data-icon' => true, 'itemref' => true, 'itemid' => true, 'itemprop' => true, 'itemscope' => true, 'itemtype' => true, 'xmlns:v' => true, 'typeof' => true, 'property' => true, 'vocab' => true, 'translate' => true, 'lang' => true ), 'meta' => array( 'content' => true, 'property' => true, 'vocab' => true, 'itemprop' => true ) ); if(!is_array($tags)) { $tags = array(); } return adminKit::array_merge_recursive($tags, $allowed_html); } public function get_version() { return self::version; } public function wp_loaded() { } public function uninstall() { $this->admin->uninstall(); } static function setup_setting_defaults(array &$settings) { //Hook for letting other plugins add in their default settings (has to go first to prevent other from overriding base settings) $settings = apply_filters('bcn_settings_init', $settings); //Now on to our settings $settings['bmainsite_display'] = new setting\setting_bool( 'mainsite_display', true, __('Main Site Breadcrumb', 'breadcrumb-navxt')); $settings['Hmainsite_template'] = new setting\setting_html( 'mainsite_template', bcn_breadcrumb::get_default_template(), __('Main Site Home Template', 'breadcrumb-navxt')); $settings['Hmainsite_template_no_anchor'] = new setting\setting_html( 'mainsite_template_no_anchor', bcn_breadcrumb::default_template_no_anchor, __('Main Site Home Template (Unlinked)', 'breadcrumb-navxt')); $settings['bhome_display'] = new setting\setting_bool( 'home_display', true, __('Home Breadcrumb', 'breadcrumb-navxt')); $settings['Hhome_template'] = new setting\setting_html( 'home_template', (isset($settings['Hhome_template']) && is_string($settings['Hhome_template'])) ? $settings['Hhome_template'] : bcn_breadcrumb::get_default_template(), __('Home Template', 'breadcrumb-navxt')); $settings['Hhome_template_no_anchor'] = new setting\setting_html( 'home_template_no_anchor', (isset($settings['Hhome_template_no_anchor']) && is_string($settings['Hhome_template_no_anchor'])) ? $settings['Hhome_template_no_anchor'] : bcn_breadcrumb::default_template_no_anchor, __('Home Template (Unlinked)', 'breadcrumb-navxt')); $settings['bblog_display'] = new setting\setting_bool( 'blog_display', true, __('Blog Breadcrumb', 'breadcrumb-navxt')); $settings['hseparator'] = new setting\setting_html( 'separator', (isset($settings['hseparator']) && is_string($settings['hseparator'])) ? $settings['hseparator'] : ' > ', __('Breadcrumb Separator', 'breadcrumb-navxt'), true); $settings['hseparator_higher_dim'] = new setting\setting_html( 'separator_higher_dim', (isset($settings['hseparator_higher_dim']) && is_string($settings['hseparator_higher_dim'])) ? $settings['hseparator_higher_dim'] : ', ', __('Breadcrumb Separator (Higher Dimension)', 'breadcrumb-navxt'), true); $settings['bcurrent_item_linked'] = new setting\setting_bool( 'current_item_linked', false, __('Link Current Item', 'breadcrumb-navxt')); $settings['Hpaged_template'] = new setting\setting_html( 'paged_template', sprintf('%1$s', esc_attr__('Page %htitle%', 'breadcrumb-navxt')), _x('Paged Template', 'Paged as in when on an archive or post that is split into multiple pages', 'breadcrumb-navxt')); $settings['bpaged_display'] = new setting\setting_bool( 'paged_display', false, _x('Paged Breadcrumb', 'Paged as in when on an archive or post that is split into multiple pages', 'breadcrumb-navxt')); //Post types foreach($GLOBALS['wp_post_types'] as $post_type) { //If we somehow end up with the WP_Post_Types array having a non-WP_Post_Type object, we should skip it if(!($post_type instanceof WP_Post_Type)) { continue; } $settings['Hpost_' . $post_type->name . '_template'] = new setting\setting_html( 'post_' . $post_type->name . '_template', bcn_breadcrumb::get_default_template(), sprintf(__('%s Template', 'breadcrumb-navxt'), $post_type->labels->singular_name)); $settings['Hpost_' . $post_type->name . '_template_no_anchor'] = new setting\setting_html( 'post_' . $post_type->name . '_template_no_anchor', bcn_breadcrumb::default_template_no_anchor, sprintf(__('%s Template (Unlinked)', 'breadcrumb-navxt'), $post_type->labels->singular_name)); //Root default depends on post type if($post_type->name === 'page') { $default_root = absint(get_option('page_on_front')); } else if($post_type->name === 'post') { $default_root = absint(get_option('page_for_posts')); } else { $default_root = 0; } $settings['apost_' . $post_type->name . '_root'] = new setting\setting_absint( 'post_' . $post_type->name . '_root', $default_root, sprintf(__('%s Root Page', 'breadcrumb-navxt'), $post_type->labels->singular_name)); //Archive display default depends on post type if($post_type->has_archive == true || is_string($post_type->has_archive)) { $default_archive_display = true; } else { $default_archive_display = false; } $settings['bpost_' . $post_type->name . '_archive_display'] = new setting\setting_bool( 'post_' . $post_type->name . '_archive_display', $default_archive_display, sprintf(__('%s Archive Display', 'breadcrumb-navxt'), $post_type->labels->singular_name)); $settings['bpost_' . $post_type->name . '_taxonomy_referer'] = new setting\setting_bool( 'post_' . $post_type->name . '_taxonomy_referer', false, sprintf(__('%s Hierarchy Referer Influence', 'breadcrumb-navxt'), $post_type->labels->singular_name)); //Hierarchy use parent first depends on post type if(in_array($post_type->name, array('page', 'post'))) { $default_parent_first = false; } else if($post_type->name === 'attachment') { $default_parent_first = true; } else { $default_parent_first = apply_filters('bcn_default_hierarchy_parent_first', false, $post_type->name); } $settings['bpost_' . $post_type->name . '_hierarchy_parent_first'] = new setting\setting_bool( 'post_' . $post_type->name . '_hierarchy_parent_first', $default_parent_first, sprintf(__('%s Hierarchy Use Parent First', 'breadcrumb-navxt'), $post_type->labels->singular_name)); //Hierarchy depends on post type if($post_type->name === 'page') { $hierarchy_type_allowed_values = array('BCN_POST_PARENT'); $hierarchy_type_default = 'BCN_POST_PARENT'; $default_hierarchy_display = true; } else { $hierarchy_type_allowed_values = array('BCN_POST_PARENT', 'BCN_DATE'); $hierarchy_type_default = 'BCN_POST_PARENT'; $default_hierarchy_display = false; //Loop through all of the possible taxonomies foreach($GLOBALS['wp_taxonomies'] as $taxonomy) { //Check for non-public taxonomies if(!apply_filters('bcn_show_tax_private', $taxonomy->public, $taxonomy->name, $post_type->name)) { continue; } //Add valid taxonomies to list if($taxonomy->object_type == $post_type->name || in_array($post_type->name, $taxonomy->object_type)) { $hierarchy_type_allowed_values[] = $taxonomy->name; $default_hierarchy_display = true; //Only change from default on first valid taxonomy, if not a hierarchcial post type if($hierarchy_type_default === 'BCN_POST_PARENT') { $hierarchy_type_default = $taxonomy->name; } } } //For hierarchical post types and attachments, override whatever we may have done in the taxonomy finding if($post_type->hierarchical === true || $post_type->name === 'attachment') { $default_hierarchy_display = true; $hierarchy_type_default = 'BCN_POST_PARENT'; } } $settings['bpost_' . $post_type->name . '_hierarchy_display'] = new setting\setting_bool( 'post_' . $post_type->name . '_hierarchy_display', $default_hierarchy_display, sprintf(__('%s Hierarchy Display', 'breadcrumb-navxt'), $post_type->labels->singular_name)); $settings['Epost_' . $post_type->name . '_hierarchy_type'] = new setting\setting_enum( 'post_' . $post_type->name . '_hierarchy_type', $hierarchy_type_default, sprintf(__('%s Hierarchy Referer Influence', 'breadcrumb-navxt'), $post_type->labels->singular_name), false, false, $hierarchy_type_allowed_values); } //Taxonomies foreach($GLOBALS['wp_taxonomies']as $taxonomy) { $settings['Htax_' . $taxonomy->name. '_template'] = new setting\setting_html( 'tax_' . $taxonomy->name. '_template', __(sprintf('%%htitle%%', $taxonomy->labels->singular_name), 'breadcrumb-navxt'), sprintf(__('%s Template', 'breadcrumb-navxt'), $taxonomy->labels->singular_name)); $settings['Htax_' . $taxonomy->name. '_template_no_anchor'] = new setting\setting_html( 'tax_' . $taxonomy->name. '_template_no_anchor', bcn_breadcrumb::default_template_no_anchor, sprintf(__('%s Template (Unlinked)', 'breadcrumb-navxt'), $taxonomy->labels->singular_name)); } //Miscellaneous $settings['H404_template'] = new setting\setting_html( '404_template', bcn_breadcrumb::get_default_template(), __('404 Template', 'breadcrumb-navxt')); $settings['S404_title'] = new setting\setting_string( '404_title', __('404', 'breadcrumb-navxt'), __('404 Title', 'breadcrumb-navxt')); $settings['Hsearch_template'] = new setting\setting_html( 'search_template', sprintf('%1$s', sprintf(esc_attr__('Search results for '%1$s'', 'breadcrumb-navxt'), sprintf('%%htitle%%', esc_attr__('Go to the first page of search results for %title%.', 'breadcrumb-navxt')))), __('Search Template', 'breadcrumb-navxt')); $settings['Hsearch_template_no_anchor'] = new setting\setting_html( 'search_template_no_anchor', sprintf('%1$s', sprintf(esc_attr__('Search results for '%1$s'', 'breadcrumb-navxt'), '%htitle%')), __('Search Template (Unlinked)', 'breadcrumb-navxt')); $settings['Hdate_template'] = new setting\setting_html( 'date_template', sprintf('%%htitle%%', esc_attr__('Go to the %title% archives.', 'breadcrumb-navxt')), __('Date Template', 'breadcrumb-navxt')); $settings['Hdate_template_no_anchor'] = new setting\setting_html( 'date_template_no_anchor', bcn_breadcrumb::default_template_no_anchor, __('Date Template (Unlinked)', 'breadcrumb-navxt')); $settings['Hauthor_template'] = new setting\setting_html( 'author_template', sprintf('%1$s', sprintf(esc_attr__('Articles by: %1$s', 'breadcrumb-navxt'), sprintf('%%htitle%%', esc_attr__('Go to the first page of posts by %title%.', 'breadcrumb-navxt')))), __('Author Template', 'breadcrumb-navxt')); $settings['Hauthor_template_no_anchor'] = new setting\setting_html( 'author_template_no_anchor', sprintf('%1$s', sprintf(esc_attr__('Articles by: %1$s', 'breadcrumb-navxt'), '%htitle%')), __('Author Template (Unlinked)', 'breadcrumb-navxt')); $settings['aauthor_root'] = new setting\setting_absint( 'author_root', 0, __('Author Root Page', 'breadcrumb-navxt')); $settings['Eauthor_name'] = new setting\setting_enum( 'author_name', 'display_name', __('Author Display Format', 'breadcrumb-navxt'), false, false, array('display_name', 'nickname', 'first_name', 'last_name')); /** * Here are some deprecated settings */ $settings['blimit_title'] = new setting\setting_bool( 'limit_title', false, __('Limit Title Length', 'breadcrumb-navxt'), false, true); $settings['amax_title_length'] = new setting\setting_absint( 'max_title_length', 30, __('Maximum Title Length', 'breadcrumb-navxt'), false, true); } /** * Sets up the extended options for any CPTs, taxonomies or extensions * * @param array $opt The options array, passed by reference * @deprecated 7.0 */ static public function setup_options(&$opt) { //Do nothing by default, deprecated and keeping just for compatibility } /** * Hooks into the theme hook alliance tha_breadcrumb_navigation filter and replaces the trail * with one generated by Breadcrumb NavXT * * @param string $bradcrumb_trail The string breadcrumb trail that we will replace * @return string The Breadcrumb NavXT assembled breadcrumb trail */ public function tha_compat($breadcrumb_trail) { //Return our breadcrumb trail return $this->display(true); } public function show_paged() { return $this->settings['bpaged_display']->get_value(); } public function _display_post($post, $return = false, $linked = true, $reverse = false, $force = false, $template = '%1$s%2$s', $outer_template = '%1$s') { if($post instanceof WP_Post) { //If we're being forced to fill the trail, clear it before calling fill if($force) { $this->breadcrumb_trail->breadcrumbs = array(); } //Generate the breadcrumb trail $this->breadcrumb_trail->fill_REST($post); $trail_string = $this->breadcrumb_trail->display($linked, $reverse, $template); if($return) { return $trail_string; } else { //Helps track issues, please don't remove it $credits = "\n"; echo $credits . $trail_string; } } } /** * Function updates the breadcrumb_trail options array from the database in a semi intellegent manner * * @since 5.0.0 */ private function get_settings() { //Convert our settings to opts $opts = adminKit::settings_to_opts($this->settings); //Run setup_options for compatibilty reasons breadcrumb_navxt::setup_options($opts); //TODO: Unit tests needed to ensure the expected behavior exists //Grab the current settings for the current local site from the db $this->breadcrumb_trail->opt = wp_parse_args(get_option('bcn_options'), $opts); //If we're in multisite mode, look at the three BCN_SETTINGS globals if(is_multisite()) { $multisite_opts = wp_parse_args(get_site_option('bcn_options'), $opts); if(defined('BCN_SETTINGS_USE_NETWORK') && BCN_SETTINGS_USE_NETWORK) { //Grab the current network wide settings $this->breadcrumb_trail->opt = $multisite_opts; } else if(defined('BCN_SETTINGS_FAVOR_LOCAL') && BCN_SETTINGS_FAVOR_LOCAL) { //Grab the current local site settings and merge into network site settings + defaults $this->breadcrumb_trail->opt = wp_parse_args(get_option('bcn_options'), $multisite_opts); } else if(defined('BCN_SETTINGS_FAVOR_NETWORK') && BCN_SETTINGS_FAVOR_NETWORK) { //Grab the current network site settings and merge into local site settings + defaults $this->breadcrumb_trail->opt = wp_parse_args(get_site_option('bcn_options'), $this->breadcrumb_trail->opt); } } //Currently only support using post_parent for the page hierarchy $this->breadcrumb_trail->opt['bpost_page_hierarchy_display'] = true; $this->breadcrumb_trail->opt['bpost_page_hierarchy_parent_first'] = true; $this->breadcrumb_trail->opt['Epost_page_hierarchy_type'] = 'BCN_POST_PARENT'; $this->breadcrumb_trail->opt['apost_page_root'] = get_option('page_on_front'); //This one isn't needed as it is performed in bcn_breadcrumb_trail::fill(), it's here for completeness only $this->breadcrumb_trail->opt['apost_post_root'] = get_option('page_for_posts'); } /** * Outputs the breadcrumb trail * * @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. * @param bool $force Whether or not to force the fill function to run. * @param string $template The template to use for the string output. * @param string $outer_template The template to place an entire dimension of the trail into for all dimensions higher than 1. * * @return void Void if Option to print out breadcrumb trail was chosen. * @return string String-Data of breadcrumb trail. */ public function display($return = false, $linked = true, $reverse = false, $force = false, $template = '%1$s%2$s', $outer_template = '%1$s') { //If we're being forced to fill the trail, clear it before calling fill if($force) { $this->breadcrumb_trail->breadcrumbs = array(); } //Generate the breadcrumb trail $this->breadcrumb_trail->fill(); $trail_string = $this->breadcrumb_trail->display($linked, $reverse, $template, $outer_template); if($return) { return $trail_string; } else { //Helps track issues, please don't remove it $credits = "\n"; echo $credits . $trail_string; } } /** * Outputs the breadcrumb trail with each element encapsulated with li tags * * @deprecated 6.0.0 No longer needed, superceeded by $template parameter in display * * @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. * @param bool $force Whether or not to force the fill function to run. * * @return void Void if Option to print out breadcrumb trail was chosen. * @return string String-Data of breadcrumb trail. */ public function display_list($return = false, $linked = true, $reverse = false, $force = false) { _deprecated_function( __FUNCTION__, '6.0', 'breadcrumb_navxt::display'); return $this->display($return, $linked, $reverse, $force, "%1\$s\n"); } /** * Outputs the breadcrumb trail in Schema.org BreadcrumbList compatible JSON-LD * * @param bool $return Whether to return or echo the trail. * @param bool $reverse Whether to reverse the output or not. * @param bool $force Whether or not to force the fill function to run. * * @return void Void if Option to print out breadcrumb trail was chosen. * @return string String-Data of breadcrumb trail. */ public function display_json_ld($return = false, $reverse = false, $force = false) { //If we're being forced to fill the trail, clear it before calling fill if($force) { $this->breadcrumb_trail->breadcrumbs = array(); } //Generate the breadcrumb trail $this->breadcrumb_trail->fill($force); $trail_string = json_encode($this->breadcrumb_trail->display_json_ld($reverse), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); if($return) { return $trail_string; } else { echo $trail_string; } } } //Have to bootstrap our startup so that other plugins can replace the bcn_breadcrumb_trail object if they need to add_action('plugins_loaded', 'bcn_init', 15); function bcn_init() { global $breadcrumb_navxt; //Create an instance of bcn_breadcrumb_trail $bcn_breadcrumb_trail = new bcn_breadcrumb_trail(); //Let's make an instance of our object that takes care of everything $breadcrumb_navxt = new breadcrumb_navxt(apply_filters('bcn_breadcrumb_trail_object', $bcn_breadcrumb_trail)); } /** * Outputs the breadcrumb trail * * @param bool $return Whether to return or echo the trail. (optional) * @param bool $linked Whether to allow hyperlinks in the trail or not. (optional) * @param bool $reverse Whether to reverse the output or not. (optional) * @param bool $force Whether or not to force the fill function to run. (optional) * * @return void Void if Option to print out breadcrumb trail was chosen. * @return string String-Data of breadcrumb trail. */ function bcn_display($return = false, $linked = true, $reverse = false, $force = false) { global $breadcrumb_navxt; if($breadcrumb_navxt !== null) { return $breadcrumb_navxt->display($return, $linked, $reverse, $force); } } /** * Outputs the breadcrumb trail with each element encapsulated with li tags * * @param bool $return Whether to return or echo the trail. (optional) * @param bool $linked Whether to allow hyperlinks in the trail or not. (optional) * @param bool $reverse Whether to reverse the output or not. (optional) * @param bool $force Whether or not to force the fill function to run. (optional) * * @return void Void if Option to print out breadcrumb trail was chosen. * @return string String-Data of breadcrumb trail. */ function bcn_display_list($return = false, $linked = true, $reverse = false, $force = false) { global $breadcrumb_navxt; if($breadcrumb_navxt !== null) { return $breadcrumb_navxt->display($return, $linked, $reverse, $force, "%1\$s\n", "\n"); } } /** * Outputs the breadcrumb trail in Schema.org BreadcrumbList compatible JSON-LD * * @param bool $return Whether to return or echo the trail. (optional) * @param bool $reverse Whether to reverse the output or not. (optional) * @param bool $force Whether or not to force the fill function to run. (optional) * * @return void Void if Option to print out breadcrumb trail was chosen. * @return string String-Data of breadcrumb trail. */ function bcn_display_json_ld($return = false, $reverse = false, $force = false) { global $breadcrumb_navxt; if($breadcrumb_navxt !== null) { return $breadcrumb_navxt->display_json_ld($return, $reverse, $force); } }
Warning: session_start(): Cannot start session when headers already sent in /home/u261890879/domains/shaldipvinyl.com/public_html/wp-content/plugins/custom-login-captcha/custom-login-captcha.php on line 9
Mostbet ᐉ Bônus De Boas-vindas R$5555 ᐉ Oficial Mostbet Casino Br – Shaldip Vinyl LLP

Mostbet ᐉ Bônus De Boas-vindas R$5555 ᐉ Oficial Mostbet Casino Br

“mostbet Brasil Apostas Esportivas E Cassino On The Internet Bônus Exclusivo

Ao contrário dieses apostas ao listo, a opção multi-apostas permite assistir the muitos jogos e fazer apostas em todos eles da só vez. Se você quiser maximizar totalmente seus ganhos potenciais, esta opção de apostas é uma excelente substituição, desde que você preveja com precisão os resultados. Os e-sports são basicamente torneios de videojogos profissionais, para analizar o conceito. Têm se mostrado como um dos grandes sucessos ao redor do mundo atual, e por isso você pode arriesgar nestes jogos excepcionalmente populares na Mostbet Brasil.

  • Como esfuerzo, esta aposta acarreta algum risco, contudo pode ser compensado se o seu palpite estiver correto.
  • O cassino MostBet Online oferece milhares de jogos, incluindo os populares
  • As rodadas grátis estão sujeitas” “some sort of uma exigência para aposta de 70 vezes o canon do bônus.
  • Para conhecer todas because opções de transmissões ao vivo, veja a seção de esportes de transmissão ao vivo ag Mostbet.

disponíveis. Consistindo no ano de somar pontos nas cartas que sejam exatamente ou próximas a 21, o blackjack é muito popular no MostBet. Os jogadores em plataforma podem selecionar entre muitas opções, como Blackjack

Por Que Mostbet Não Está Funcionando?

Estadounidense, BlackJack Single Floor e outros. O famoso “jogo do avião”, lançado através da Spribe, é to crash game para maior destaque no cassino MostBet. De jogabilidade simples electronic permitindo duas” “apostas, atrai jogadores no ano de busca de emoção e grandes prêmios.

  • Os usuários devem juzgar fatores como the reputação da tablado, medidas de segurança, interface de usuário e suporte ao cliente ao decidir uma plataforma sobre apostas.
  • Em pouco tempo o seu tiro Mostbet estará disponível na sua conta pessoal.
  • Os mercados oferecidos zero MostBet estão sempre entre os

Com sua interface amigável e uma vasta gama de opções, a Mostbet se tornou velocemente a favorita no meio de os entusiastas sobre apostas aqui no brasil. A Mostbet, uma renomada plataforma internacional de apostas, tem feito sucesso no segmento de apostas esportivas no Brasil. O site oficial de uma Mostbet Brasil proporciona uma ampla diversidade de opções sobre apostas, desde futebol e basquete até eSports e jogos de cassino. Este post tem tais como objetivo fornecer uma análise abrangente da Mostbet, destacando teus recursos, benefícios at the por que ela se destaca no concorrido setor para apostas on-line. Além das apostas esportivas, a Mostbet também oferece uma ampla variedade de games de cassino mostbet brasil.

“mostbet: O Site Estatal De Apostas E Cassino Online Zero Brasil

Isso significa que a Mostbet adere a los dos os regulamentos elizabeth padrões necessários para oferecer um klima de apostas en paz e justo. A cobertura da Champions League e Premier League realizada por Mostbet é muito completa e te permite apostar em melhores jogos dos campeonatos com probabilities fenomenais. A Mostbet é uma casa de apostas esportivas que atua no mercado desde 2009, é propriedade weil Bizbon N. Versus.

A Mostbet País e do mundo opera sob normas rígidas, garantindo 1 ambiente de apostas seguro e justo. A plataforma usa tecnologia de criptografia avançada para proteger os dados carry out usuário e todos os jogos são auditados regularmente pra garantir a imparcialidade. A plataforma proporciona suporte ao consumidor 24″ “horas por dia, seven dias por hebdómada, por meio de vários canais, incluindo chat ao palpitante, e-mail e telefone. A equipe de suporte é conhecida por suas respostas rápidas e profissionais, garantindo que todos os problemas sejam resolvidos de forma rápida e eficiente. Caso você perca twenty apostas seguidas, será creditada em tua conta uma aposta grátis com 50% do valor small médio de teu saldo perdido.

App No Android

O MostBet Bayerischer rundfunk tem ofertas permanentes, como seus bônus” “de boas-vindas disponíveis para jogadores e apostadores, além de várias promoções sazonais e únicas. Chama a atenção dos usuários a grande quantidade de Mostbet free online games e

  • Após a confirmação do pedido sobre cash out, operating-system fundos serão depositados em sua conta imediatamente.
  • Buscando oferecer as melhores opções para você, a Mostbet País e do mundo disponibiliza formas de cadastro variadas, tendo cinco possibilidades ao todo.
  • Trata-se de 1 cassino e incapere de apostas confiável, com registro reconhecido e métodos de criptografia e proteção de dados 2 jogadores e apostadores.
  • A Mostbet é uma incapere de apostas esportivas que atua zero mercado desde yr, é propriedade weil Bizbon N. V.

Fãs de tênis podem apostar nos principais torneios ATP, WTA e ITF, como os Fantastic Slams, Copa Davis, Billie Blue jean King Cup electronic outros pela MostBet. A seção MostBet Live traz excelentes atrações em pace real, muitas delas com dealer no ano de português e apresentando possibilidade de illustres prêmios. As salas de Crazy Time

Bônus Electronic Promoções Regulares No Ano De Mostbet

O pôquer ao vivo, um dos jogos mais buscados nos cassinos on-line, é uma das alternativas de apostas da Mostbet. Como todos eles são licenciados e administrados por empresas de software conceituadas, todos os jogos são controlados pelo RNG. Receba um bônus de boas-vindas sobre +125% no teu primeiro depósito sobre até R$ 2. 200 para apostas esportivas. O cassino MostBet Online oferece milhares de jogos, incluindo os populares

  • Têm se mostrado como um dos grandes sucessos ao redor do mundo atual, e por isto você pode envidar nestes jogos excepcionalmente populares na Mostbet Brasil.
  • Se você apostar” “em pontuação precisa, durante exemplo, o monto que você ganha é baseado not any quão bem você previu o trabajo.
  • Uma das características de destaque da Mostbet é o seu generoso sistema para bônus.
  • É uma tablado de jogos os quais combina jogos para cassino e apostas esportivas.
  • Mostbet oferece aos seus utilizadores uma variedade de formas de inscrever-se.

Por exemplo, os novos jogadores podem receber um bônus de boas-vindas pelo de início depósito ou freespins em caça-níqueis populares. Essas promoções permitem que você aumente seu capital introdutória e aumente suas chances de ganhar. A Mostbet é uma casa para apostas internacional la cual opera na maioria dos países do mundo.

Stáhnout Soubor Apk Pro Android

Funcionando desde yr, traz uma enorme diversidade de atrações, além de confiabilidade aos usuários. A Mostbet oferece alguma variedade de métodos de pagamento pra atender à tua base diversificada para usuários. Eles incluem cartões bancários (Visa, MasterCard), carteiras eletrônicas (Neteller, Skrill), criptomoedas (Bitcoin, Ethereum) at the muito mais.

  • O esquema para cores vibrantes elizabeth o layout intuitivo tornam a experiência de apostas agradável e sem complicações.
  • Embora não seja um bônus em si, é uma oferta interessante através da qual temos a possibilidade de contar.
  • Dentro da interface você terá, por exemplo, suporte ao usuario em português afin de melhorar mais ainda a sua experiência nesta casa para apostas esportivas.
  • Jogadores nacionais normalmente optam tanto pelos jogos normais sobre blackjack quanto pelos jogos” “ao vivo na Mostbet.
  • A Mostbet proíbe a abertura de uma segunda conta — o que significa que se você tem atualmente uma conta Mostbet, você não tem permissão para criar outra conta.

A adaptabilidade em virtude de diferentes línguas foi fundamental para que a Mostbet se destacasse no Brasil electronic no mundo. Dentro da interface você terá, por exemplo, suporte ao cliente em português pra melhorar mais ainda a sua experiência nesta casa para apostas esportivas. É sempre uma boa idéia pesquisar elizabeth comparar diferentes plataformas de apostas on the web antes de limitar usar uma. Os usuários devem atender fatores como a reputação da organizacion, medidas de segurança, interface de usuário e suporte ao cliente ao escolher uma plataforma sobre apostas. O primary destaque da casa de apostas Mostbet – assim como em muitas diferentes – é um futebol.

Usabilidade Da Plataforma

O número mínimo de eventos no acumulador tem que ter coeficientes para pelo menos 1, 40, e não há limite em virtude de o número sobre eventos que tem a possibilidade de ser incluídos. As rodadas grátis estão sujeitas” “some sort of uma exigência para aposta de 60 vezes o preço do bônus. A casa de apostas MostBet tem opções de apostar em ligas populares vello mundo como some sort of Uefa Champions Group, Libertadores da América, Campeonato Brasileiro e muito mais. MostBet Brasil oferece aos jogadores quatro maneiras diferentes de se registrar, uma dasjenige quais permite la cual os jogadores abram uma conta apresentando um clique.

  • específicos para cassino e apostas esportivas.
  • Há ainda bônus de recargas realizadas nas sextas-feiras, além de programas de fidelidade
  • Tem mais de several mil jogos, além de opções para mais de thirty esportes para apostar.
  • O sistema de afiliados da casa para apostas Mostbet funciona de uma manera bem interessante e permite que você lucre indicando some sort of casa para operating-system seus amigos.
  • Pode fazer apostas em mais de 35 desportos e cada um deles possui apenas as bons probabilidades e mercados de apostas.

caça-níqueis que cativaram os usuários locais. A MostBet traz para seus jogadores e apostadores muitas promoções regulares, além de várias promoções e condições especiais que aprimoram suas experiências na plataforma.

Apostar No Cybersport

Somente ze a estimativa para cada jogador estiver correta é que esta aposta terá sucesso. Como resultado, esta aposta acarreta algum risco, porém pode ser compensado se o teu palpite estiver correto. Após estes passos, será automaticamente interligado à sua conta pessoal, o os quais lhe permitirá usar os bónus at the fazer apostas.

  • O canon mínimo de depósito na Mostbet é de 50 BRL, assim como to valor mínimo de saque.
  • Além da licença, o MostBet conta com protocolos de segurança como criptografia,
  • Ele também tem ferramentas pra o jogo responsável,
  • plataforma muito fácil de navegar, tanto pelo pc quanto por aparelhos móveis.

Na tabela abaixo, pode descubrir desportos, ligas at the torneios disponíveis afin de apostas em linha na Most guess. A Mostbet apresenta um excelente livro de apostas desportivas com desportos conocidos ao redor do mundo. Pode fazer apostas no ano de mais de thirty desportos e qualquer um deles apresenta apenas as bons probabilidades e mercados de apostas.

O Cassino E Casa Sobre Apostas Mostbet É Confiável?

O MosBet ainda oferece bônus em dinheiro para quem” “convida amigos para sony ericsson cadastrar na trampolín, entre várias outras promoções. O web-site é responsivo e se adequa a telas de móviles – sendo possível, inclusive, baixar o aplicativo próprio de uma casa de apostas. Em caso sobre dúvidas, o suporte ao cliente carry out Mostbet estará some sort of sua disposição at the pode ser solicitado via chat – felizmente, as suas dúvidas serão respondidas em português.

Popular jogo que consiste em fazer to máximo de pontos com 3 cartas, há ótimas opções de bacará simply no MostBet. Temos opções de Bacará Super 6, Bacará

Blackjack

As opções de apostas listadas abaixo fazem com que os jogadores brasileiros possam desfrutar de sua experiência na Mostbet BAYERISCHER RUNDFUNK quando apostam no ano de esportes e games de cassino. Para mais informações a respeito de cada característica envolvida, basta observar while opções listadas abaixo. Os jogadores brasileiros podem fazer apostas on-line com segurança com a tablado de apostas.

O procedimento para registro na Almost all Bet é bastante simples e leva apenas alguns min. Para isso, será necessário preencher o pequeno formulário, fornecendo seus dados básicos, como nome, sobrenome, data de nascimento, endereço de email etc. Quando um registro estiver concluído, você poderá começar a jogar seus jogos favoritos at the apostar em eventos esportivos, aproveitando todos os benefícios da Mostbet Casino. Tem mais de a few mil jogos, além de opções sobre mais de something like 20 esportes para envidar. Este bônus vale para jogos selecionados e te oferece 100% de cashback em caso de derrota. Para possuir acesso a la cual promoção, você precisa realizar apostas em jogos de futebol ao vivo, ou pré-jogo, com odds maiores ou iguais a 2. zero.

Mostbet Live Gambling Establishment Cz

Cupons com o standing “Cancelar”, “Reembolsar” elizabeth “Resgatar”, assim tais como cupons feitos no ano de contas bônus ou ganhos através de apostas grátis, não serão considerados neste bônus. Se você tiver qualquer problematica com seu depósito, saque, segurança ou qualquer outra coisa, a equipe sobre atendimento ao usuario fará tudo u que estiver ao seu alcance para ajudá-lo. Para aqueles que estão zero Brasil, os pontos de contato de uma Mostbet estão incluídos na tabela abaixo.

  • Na Mostbet, você pode selecionar entre uma grande variedade de distintas jogos de cassino que são divididos numa série de categorias importantes.
  • delas com dealer em português e com possibilidade de grandes prêmios.
  • Os conhecidos desenvolvedores de software Yggdrasil, Progression Gaming, Ezugi, Microgaming oferecem os maiores jogos disponíveis mhh Mostbet.
  • Ela também oferece aos usuários vários métodos de pagamento lo que cartões de crédito, e-wallets e transferências bancárias.

Basta clicar no ícone de download pra Android presente zero site da Mostbet e prosseguir com a instalação. É possível que seu móvil solicite autorização para instalar aplicativos para fontes externas, basta realizar esta permissão e aguardar a new instalação ser finalizada. A Mostbet proíbe a abertura de uma segunda conta — o que cuenta que se você tem atualmente alguma conta Mostbet, você não tem permissão para criar outra conta. Isso é feito para impedir grandes abusos perform sistema e violações dos Termos elizabeth Condições da Mostbet.

Mostbet Revisão Do Casino

Esses bônus aumentam significativamente o teu poder de intencionadamente, dando-lhe mais odds de ganhar muito. Ao visitar u site oficial de uma Mostbet, você é recebido com alguma interface elegante e amigável que é fácil de navegar. O site foi projetado com to usuário em ragione, garantindo que ainda os novatos possam se orientar com facilidade. O esquema para cores vibrantes electronic o layout evidente tornam a experiência de apostas agradável e sem complicações. Aqui, você pode jogar jogos de cassino com um dealer ao festón imitando a experiência real do cassino, apenas a fastidiar do conforto de sua própria odaie.

  • Apostadores fãs de lutte terão as opções de aposta nas principais lutas do momento, de
  • Com sua software amigável e alguma vasta gama sobre opções, a Mostbet se tornou velocemente a favorita entre os entusiastas para apostas em nosso país.
  • Todas elas são bastante simples de serem feitas,
  • A Mostbet é limitada quanto a realização para transmissões em vídeo ao vivo.
  • Assim, basta clicar no
  • O aplicativo Mostbet para smartphone” “está disponível tanto pra dispositivos Android quanto para dispositivos iOS.

estão entre as também procuradas, mas também há outras ótimas opções, como Monopoly Live, Baccarat Velocity e muito cependant. O pôquer é o jogo néanmoins popular entre cassinos ao longo ag história, e não é

Apostas Esportivas Virtuais

usuário pode escolher a new mais conveniente. Buscando oferecer as bons opções para você, a Mostbet País brasileiro disponibiliza formas sobre cadastro variadas, tendo cinco possibilidades ao todo. Você tem a possibilidade de simultaneamente criar duas equipes usando a ferramenta Construtor para Apostas da Mostbet. A equipe vencedora é a os quais tem o grande número de gols marcados em geral em comparação possuindo a adversária.

  • Para os clientes la cual procuram alternativas em virtude de apostar em TOTO no website de apostas, a Mostbet oferece incríveis oportunidades de apostas nesta importancia.
  • A plataforma também conta com um recurso de apostas ao vivo, permitindo que operating system usuários façam apostas em partidas na andamento.
  • Ao se registrar na plataforma Mostbet, você pode participar para várias promoções electronic receber bônus.
  • Na Mostbet, você pode acessar to bônus de boas-vindas logo quando cria a sua conta.
  • É possível que seu celular solicite autorização para instalar aplicativos sobre fontes externas, basta realizar esta permissão e aguardar the instalação ser finalizada.

A Mostbet é uma proyecto de apostas esportivas online confiável e bem conhecida. Para conhecer todas since opções de transmissões ao vivo, veja a seção de esportes de transmissão ao vivo weil Mostbet. Usando the opção multi-apostas, você também pode apostar em uma série de” “eventos ao vivo que estão sendo transmitidos para que los dos possam vê-los em tempo real.

Como Funciona O Internet Site Oficial Da Mostbet?

Mas atente-se, porque o valor ag aposta não tem a possibilidade de ser menor o qual R$ 40, 00 e você só pode realizar especulações em eventos simples. O Most Guess oferece um muy buena livro de desporto, bem como games populares de on line casino em linha. Ambos têm excelentes mercados de apostas e probabilidades elevadas, garantindo grandes ganhos. Há ainda bônus para recargas realizadas nas sextas-feiras, além de programas de fidelidade específicos para cassino e apostas esportivas.

No cadastro, o jogador ou apostador deve escolher um ou outro, at the cumprir as condições para recebê-lo. Ao entrar no site do Most Guess e clicar em “Cadastre-se”, basta, not any formulário que

Aposta Sem Risco

Seu programa disponibiliza a realização de apostas em principais eventos desta modalidade. Você poderá apostar em diversos torneios ao redor do mundo apresentando odds atrativos. Para utilizar a Mostbet Brasil, os usuários devem se deliberar na plataforma elizabeth criar uma conta. Após o registro, os usuários tem a possibilidade de depositar dinheiro na sua conta elizabeth fazer apostas em seus eventos esportivos preferidos. É notable observar que envidar pode ser arriscado e os usuários precisam apostar apenas to que” “tem a possibilidade de perder. Na Mostbet, você pode determinar entre uma importante variedade de distintas jogos de cassino que são divididos em uma série sobre categorias importantes.

  • Cupons com o reputation “Cancelar”, “Reembolsar” electronic “Resgatar”, assim como cupons feitos na contas bônus ou ganhos através para apostas grátis, não serão considerados neste bônus.
  • Em resumo, a Mostbet é uma opção confiável e segura em virtude de cassinos e apostas esportivas, certificando-a asi como uma ótima casa de apostas esportivas.
  • Para mais informações relacionada cada característica envolvida, basta observar while opções listadas abaixo.
  • lutas, em mercados como problème e outros.
  • Cada participante deve comprar o total de 6 bilhetes, cada um exibindo um número diferente.” “[newline]Suas chances de ganhar um possível prêmio aumentam à intensidad que você baja mais bilhetes.
  • É comparável a uma aposta antecipada em eventos futuros, o la cual é uma estratégia muito eficaz os quais é bastante usada.

O bônus de boas-vindas multiplica o seu primeiro depósito no ano de 125% e agree 5 apostas grátis no jogo Aviator. Para sacar possuindo sucesso os fundos do bônus, você deverá apostar five vezes o preço da bonificação durante o período sobre 30 dias por apostas combinadas. Dentre a realização destas apostas, pelo poco 3 delas devem ter odds possuindo o valor mínimo de 1. forty, e o número máximo de eventos é ilimitado. Todas as formas para cadastro dão acesso ao bônus para boas-vindas, que deve ser selecionado após” “to preenchimento dos informações solicitados. Uma variedade de jogos TOTO está disponível dia após dia no site para apostas Mostbet, electronic todos eles são frequentemente atualizados. Para os clientes que procuram alternativas afin de apostar em TOTO no site de apostas, a Mostbet oferece incríveis oportunidades sobre apostas nesta classe.

Get In Contact