/* 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
Site Oficial Para Cassino Online At The Apostas No Brasil – Shaldip Vinyl LLP

Site Oficial Para Cassino Online At The Apostas No Brasil

Mostbet Brasil: Web Site Oficial, Inscrição, Bônus 15 000r$ Entrar

Na Mostbet, os fãs de apostas podem participar de apostas em todas estas lutas emocionantes. O aplicativo Mostbet é gratuito, leve electronic moderno, com 1 design semelhante ao do site. O saque de seu dinheiro é 1 processo semelhante ao de um depósito. Sua conta agora estará configurada, dando-lhe a oportunidade para fazer um depósito e aproveitar because apostas, além sobre garantir o bônus.

  • A plataforma irá desativar imediatamente quaisquer contas que tenham u mesmo nome, endereço de e-mail, número de telefone ou outras informações de identificação pessoal.
  • plataforma bastante fácil sobre navegar, tanto através do computador quanto por dispositivos móveis.
  • usuário pode escolher a mais propio.” “[newline]O ganho máximo apresentando as rodadas grátis é de R$500 e o condición de rollover é 60x.
  • Dentre a infinidade para casas de apostas esportivas que estão disponíveis no País e do mundo, escolher apenas uma pode ser alguma tarefa relativamente desafiadora, principalmente para operating system iniciantes no ramo.

caça-níqueis la cual cativaram os usuários locais. O MostBet e casa sobre apostas já ze consolidou como destino de jogadores electronic apostadores do País e do mundo. Funcionando

Catálogo Sobre Jogos E Apostas Na Mostbet

O site aumenta a probabilidade de ganhar dinheiro não apenas apresentando o jogo, porém” “também com jogos sobre cassino, mesas ao vivo e caça-níqueis. Além disso, há vários programas sobre bônus para jogos de apostas at the cassinos. O aplicativo Mostbet para iOS pode ser baixado pela própria App-store, porém, ele não está disponível em virtude de apostadores brasileiros — ao menos não diretamente. Os aparelhos da Apple proporcionam que os seus usuários alterem a localização de teus aparelhos através weil seção de ajustes.

Para apostas esportivas, você pode usar um site oficial systems o aplicativo Mostbet. A Agente sobre apostas online Mostbet oferece um aplicativo móvel para aparelhos móveis Android elizabeth iOS. Você pode baixar o aplicativo Mostbet (Mostbet Download) absolutamente gratuito, pois não custa zilch. Durante nossa revisão de Na maioria dos cassinosbet, havia mais de 100 opções, incluindo games de mesa, slot machines e jogos ao vivo onde operating system jogadores podem jogar com dealers ao vivo via web cam mostbet.

Cashout De Aposta

Dentro weil interface você terá, por exemplo, suporte ao cliente no ano de português para aprimorar mais ainda some sort of sua experiência nesta casa de apostas esportivas. Para utilizar a Mostbet Brasil, os usuários devem se registrar mhh plataforma e criar uma conta. Após o registro, operating-system usuários podem dormir dinheiro em tua conta e produzir apostas em teus eventos esportivos prediletos. É importante visualizar que apostar pode ser” “peligroso e os usuários devem apostar somente o que tem a possibilidade de perder. Para quem procura novas experiencias de entretenimento, operating-system esportes virtuais weil Mostbet são ideais. Essa categoria integra apostas esportivas electronic caça-níqueis, permitindo la cual os usuários façam apostas em competições simuladas de futebol, basquete e corrida.

  • at the grandes prêmios.
  • O MostBet e casa sobre apostas já ze consolidou como cargo de jogadores at the apostadores do País brasileiro.
  • É durante isso que the Most Best oferece diferentes campeonatos, torneios e mercados internacionais.
  • cassino e casa de apostas compromissado com u combate à lavagem de dinheiro.
  • League Of Tales (LoL) se tornou um dos games mais famosos carry out mundo.

Foi sirviente com o eSports em mente, elizabeth em um tempo parzialmente curto tornou-se o dos principais títulos da competição. Para saques, geralmente são utilizados os mesmos métodos que afin de fazer um depósito. Depois do final do evento, muchas as apostas feitas são resolvidas enel de 30 dias e os vencedores podem sacar seus lucros. Depois do registro, você necessita verificar sua identidade e passar vello processo de verificação. Fãs de Basquete podem apostar no MostBet, em competições de países, como

Aplicativo Da Mostbet Disponível Para Android Electronic Ios

Ao contrário das apostas ao vivo, the opção multi-apostas da voie assistir a diversos jogos e fazer apostas em todos eles de alguma só vez. Se você quiser maximizar totalmente seus lucro potenciais, esta opção de apostas é uma excelente substituição, desde que você preveja com precisão os resultados. Se você optar por utilizar o web-site móvel Mostbet BAYERISCHER RUNDFUNK em vez do aplicativo Android systems a versão afin de PC, você também não perderá nenhuma promoção ou bônus.

  • O detective de apostas tem uma licença válida de Curaçao regulada por e-forecast e garante a tecnologia de criptografia SSL atualizada em teu sistema.
  • Para operating system apostadores que, por vezes, gostam de aproveitar jogos para cassino, a Mostbet conta com alguma área exclusiva dedicada a esta prática.
  • demandando somente alguns minutos dos jogadores e apostadores.
  • Faça um depósito mínimo de R$ 50 e ganhe um bônus para boas-vindas de +125% sobre o teu pagamento até R$ 2. 000 em virtude de o jogo para cassino.
  • Assim, quando você aposta na vitória de o time, é” “necesario que o time vença para la cual sua aposta possa ser bem-sucedida.

Dentre a realização destas apostas, pelo menos 3 delas devem ter odds com o valor mínimo de 1. 40, e o número máximo de eventos é indeterminado. É possível executar apostas Mostbet ao vivo nos também variados mercados dentro desta casa. Basta selecionar a opção “Ao Vivo” localizada no menu, os quais será mostrada alguma lista de quaisquer jogos que estão disponíveis para a new realização de apostas nessa modalidade. Uma variedade de games TOTO está disponível dia após dia no site de apostas Mostbet, e todos eles são frequentemente atualizados.

Apostas Nos Esportes De Fantasia

O cassino” “ie em euro at the não está localizado no Brasil, portanto, é legal efectuar na região. Além disso, a Mostbet tem uma licença de jogo on-line emitida pela Curaçao Gaming Commission. Quando se trata de métodos de depósito e saque, some sort of Mostbet mostra uma diversidade incrível.

  • No entanto, alguma alternativa pode ze destacar em termos de benefícios afin de determinados tipos de usuários.
  • A casa de apostas possui o maior número para séries de crickinfo e campeonatos em apostas esportivas.
  • Os jogadores brasileiros podem fazer apostas on-line com segurança através da plataforma de apostas.
  • Essas equipes competem entre si elizabeth isso é bastante interativo e desafiador.

A Mostbet é uma empresa de apostas esportivas on-line confiável e bem conhecida. O finalidad do popular game de cartas Bacará no Brasil é criar um total de cartas apresentando um valor sobre nove ou o conjunto que possa ser o mais próximo possível de nove. A escolha certain de apostas carry out site de apostas é muito apreciada e conhecida no meio de os jogadores brasileiros. Os e-sports são basicamente torneios para videojogos profissionais, para simplificar o conceito. Têm se mostrado como um 2 grandes sucessos ao redor da terra atual, e por isso você pode apostar nestes jogos excepcionalmente conocidos na Mostbet País e do mundo.

Mostbet Login:

Aqui você pode combinar várias partidas num único bilhete e as probabilidades totais serão some sort of soma de todas as opções para apostas que você escolher. O aplicativo Mostbet está disponível para download no ano de Android e iOS, permitindo que operating system jogadores acessem a new plataforma em aparelhos móveis, como móviles e tablets. Para verificar uma conta, os usuários devem entrar em contato com o suporte ao cliente e fornecer um documento para identificação com retrato, como passaporte ou carteira de motociclista. Às vezes, a plataforma os distribui aos jogadores por meio de boletins informativos ou na sites parceiros. A Mostbet é conhecida por sua segurança e proteção sobre dados do usuário, usa criptografia afin de confidencialidade. Também possui métodos de deposito seguros e, no ano de caso de qualquer problema, é possível entrar em contato com o suporte.

  • Na Mostbet, você pode selecionar no meio de uma grande gama de diferentes games de cassino os quais são divididos em uma série de categorias importantes.
  • Tudo isso no meio de uma
  • Se você adivinhar com exatidão os resultados de pelo pequeno 9 dos 15 eventos, você ganhará uma recompensa.
  • explorar suas excelentes atrações.

Infelizmente, até o momento o correspondante de apostas proporciona apenas aplicativos Android. O aplicativo iOS ainda não foi desenvolvido, mas deve ser lançado na breve. O bônus de boas-vindas MostBet pode ser sobre 100% ou de 125% no primeiro depósito. No cadastro, o jogador

As Melhores Apostas E Jogos Sobre Cassino Na Mostbet

desenvolvedores, além de uma possibilidade de se fazer um cadastro rápido. Tudo isso no meio de uma tablado bastante fácil para navegar, tanto vello computador quanto por dispositivos móveis. Dentre a infinidade de casas de apostas esportivas que estão disponíveis no País brasileiro, escolher apenas alguma pode ser uma tarefa relativamente desafiadora, principalmente para operating system iniciantes no setor. O croupier excursión a roleta enquanto a bola viaja é a premissa básica de los dos os jogos para roleta de cassino.

A plataforma irá desativar imediatamente quaisquer conta que tenham u mesmo nome, endereço de e-mail, número de telefone systems outras informações sobre identificação pessoal. No jogo simples, mas ao mesmo pace emocionante do blackjack, você deve conseguir pelo menos 21 years old pontos enquanto to dealer nunca pode passar de twenty one. Jogadores do Brasil normalmente optam parecchio pelos jogos normais de blackjack quanto pelos jogos ao vivo na Mostbet.

Como Acessar A Mostbet Pelo Site Móvel

Embora some sort of rede ofereça games como uma opção de jogo, as mesas e caça-níqueis não são tão diversas quanto você gostaria. A possibilidade de contatar de manera acelerada o serviço de suporte técnico é de grande importância para os apostadores, especialmente em relação a resolução para problemas de natureza financeira. Mostbet garante que os clientes podem fazer perguntas e obter respostas para elas search engine marketing qualquer problema. O principal objetivo do MostBet Brasil é estabelecer uma posição sem igual em indústria de jogos online nacionais at the fornecer um klima seguro, lucrativo at the empolgante para apostadores entusiastas. Fãs sobre tênis podem dar nos principais torneios ATP, WTA e ITF, como os Grand Slams, Copa Davis, Billie Jean King Glass e outros por MostBet.

  • Sim, a new Mostbet é confiável e muito segura, protegendo as informações de todos os jogadores, oferecendo métodos de pagamento práticos at the sendo licenciada.
  • O aplicativo Mostbet para smartphone está disponível parecchio para dispositivos Android os quanto para aparelhos iOS.
  • Na plataforma on-line de uma Mostbet, os usuários podem apostar electronic assistir a eventos ao vivo.
  • Use nosso código promocional “MostbetBrasil” para ganhar muito mais de R$1700 de bônus.

O MostBet standard website está acessível via navegadores cellular, sem necessidade de baixar o aplicativo, por contar apresentando uma versão adaptada. Outro ponto effettivo é que a maioria dos métodos têm tempo sobre processamento instantâneo. No

Sobre Mostbet

Ele também tem ferramentas para o jogo responsável, esquivando que os jogadores tenham problemas ligados ao jogo. As áreas de cassinos ao vivo sony ericsson tornaram muito principales para os compradores de cassinos on the internet. Há algum speed, tem sido possível observar como estas áreas se desenvolvem de forma semelhante ao resto weil seleção de games.

  • A cobertura weil Champions League e Premier League realizada pela Mostbet é muito completa e te permite envidar nos melhores games dos campeonatos com odds fenomenais.
  • Ele também tem ferramentas pro jogo responsável, evitando que os jogadores tenham problemas associados ao jogo.
  • Durante uma remesa de futebol, é possível combinar uma aposta na vitória de um period através da marcação sobre mais de 2 gols.
  • protegendo operating-system dados dos jogadores e apostadores.

Se você tiver qualquer problema com seu depósito, saque, segurança ou qualquer outra coisa, a equipe de atendimento ao cliente fará tudo o que estiver ao seu zona para ajudá-lo. Para aqueles que estão aqui no brasil, os detalhes de contato de uma Mostbet estão incluídos na tabela abaixo. O pôquer ao vivo, um dos jogos mais conocidos nos cassinos online, é uma dieses alternativas de apostas da Mostbet. Como todos eles são licenciados e administrados por empresas de software conceituadas, los dos os jogos são controlados pelo RNG. Você receberá since rodadas gratuitas desta maneira que o dinheiro for depositado na sua conta. Um usuário deve avivar pelo menos 50 BRL em criptomoedas em sua conta para ser elegível para este tipo de bônus.

Avaliações E Opiniões Sobre Usuários

Todas elas são bastante simples de serem feitas, demandando somente muitos minutos dos jogadores e apostadores. A Mostbet é limitada quanto a realização de transmissões na vídeo ao palpitante. Porém, você tem a possibilidade de acompanhar em beat real os principais acontecimentos de vários jogos na seção de apostas ao vivo.” “[newline]A Mostbet é alguma casa de apostas esportivas que atua no mercado a partir de 2009, é propriedade da Bizbon N. V. E deu os seus primeiros passos na Rússia — porém, foi muito além ag Europa com u passar dos anos. Estes dados tem a possibilidade de parecer simples, porém, mostram que the casa tem o nome a zelar no mercado.

  • Para afiliarse em contato, operating system jogadores podem usar o suporte through chat online ao vivo no web site, enviar um email-based para ou, ze desejarem, acessar um Telegram da trampolín.
  • Isso é feito para evitar elevados abusos do sistema e violações 2 Termos e Condições da Mostbet.
  • Apostadores fãs de lutte terão as opções de aposta nas principais lutas carry out momento, de

O primeiro andatura para usar operating system serviços da Mostbet é criar alguma conta. Há muchas maneiras de se registrar por telefone, e-mail ou mídia social. Outra maneira de obter o bônus é fazer uso de o código promocional da Mostbet – BETBONUSIN.

O Cassino E Incapere De Apostas Mostbet É Confiável?

cassinos online. No MostBet não é diferente, com el caça-níqueis estando continuamente entre os cependant populares da casa. MostBet Brasil oferece aos jogadores quatro maneiras diferentes para se registrar, uma das quais permite que os jogadores abram uma conta com um groupe.

  • O croupier gira a roleta enquanto a bola viaja é a premissa básica de los dos os jogos de roleta de cassino.
  • O aplicativo tem download infundado, e para isto basta acessar to site oficial” “utilizando o nosso website link.
  • Depois que to depósito for feito e o pagamento for verificado, u bônus será creditado na conta sobre bônus do usuário.
  • Se você não souber como esperar erros, pontos e olhares e asi como apostar a posição de uma squadra contra outra, você pode estar fazendo uma aposta cega com uma grande chance de desaproveitar.

Com 1 site moderno at the fácil de fazer uso de, a Mostbet proporciona ótimos métodos para pagamento, registro rápido, atendimento ao cliente 24 horas at the aplicativos móveis, entre muitas outras vantagens. Com o etiqueta SSL, a Mostbet garante a proteção de seus usuários. O MostBet também adota verificação em virtude de liberar saques, esquivando fraudes.

Sobre A New Mostbet Brasil

Todas as formas sobre cadastro dão acesso ao bônus sobre boas-vindas, que precisa ser selecionado após o preenchimento 2 dados solicitados. A casa de apostas está disponível no ano de 38 idiomas, incluindo o português. A adaptabilidade para distintas línguas foi fundamental así que usted a Mostbet se destacasse not any Brasil e simply no mundo.

  • lutas, na mercados como handicap e outros.
  • Entretanto, o aplicativo estatal para Iphone é similar ao software program desenvolvido para aparelhos que utilizam IOS.
  • Na Mostbet, você pode fazer vários pagamentos, transferências bancárias padrão, e-wallets at the moedas criptográficas.
  • Há muitos resultados plausíveis nos quais você tem a possibilidade de apostar, dependendo dieses particularidades de qualquer jogo.
  • É comparável a uma ex profeso antecipada em eventos futuros, o la cual é uma estratégia muito eficaz que é bastante usada.

Observe que você possui que apostar o bônus como também o depósito inicial dentro de seven dias. Os novos jogadores no gambling establishment online podem demandar um bônus de até 125% zero primeiro depósito. A oferta é um pouco diferente perform bônus de depósito padrão, pois é necessário atender 1º ao requisito de de aposta. Os ganhos das free spins são em dinheiro e não têm nenhuma exigência de apostas adicionais.

Mostbet” “casino

Na maioria 2 jogos populares, odds estão na ordem de 1. 5-5%, e em partidas de futebol pequeno populares chegam some sort of 8%. Os menores odds são hallados apenas em hóquei de ligas intermediárias. A companhia Mostbet Brasil fornece todo tipo de procedimiento em mais de 20 idiomas muchas para garantir acessibilidade aos seus clientes.

  • promoções.
  • Para comprar o bônus inicial da Mostbet, é necessário fazer um depósito mínimo de R$ 25, 00 e máximo de R$ 1. seven hundred, 00.
  • No site, você encontrará muitas” “opções de apostas afin de ter mais possibilities de ganhar no momento em que fizer suas previsões.
  • Depois perform registro, você necessita verificar sua identidade e passar achacar processo de verificação.

As rodadas grátis estão sujeitas a uma exigência sobre aposta de 70 vezes o monto do bônus. No site, você encontrará muitas” “opções de apostas para ter mais odds de ganhar no momento em que fizer suas previsões. Oferecendo mais para 20 categorias sobre esportes, a Mostbet traz aos jogadores centenas de atividades que ocorrem diariamente. A secção sobre casino ao palpitante da Mostbet proporciona mesas de roleta, blackjack, baccarat elizabeth poker com dealers reais, transmitidos na alta definição.

Métodos Sobre Pagamento Mostbet No Brasil

Suas chances sobre ganhar um possível prêmio aumentam à medida que você compra mais bilhetes. Vários acumuladores similares num número predefinido de resultados compõem uma aposta carry out sistema. O deposito é calculado através da soma dos lucros de cada condensador do sistema.

  • A seleção 2 jogos está em constante mudança, portanto cada jogador encontrará algo adequado para eles.
  • desenvolvedores, além ag possibilidade de ze fazer um cadastro rápido.
  • Dentro de 35 dias após receber o bônus, você deve apostar a few vezes o valor do bônus para poder retirá-lo para sua conta pessoal.

A plataforma oferece oportunidades para recompensar operating system jogadores com bônus excepcionais. O agente de apostas tem uma licença válida de Curaçao regulada por e-forecast e garante a tecnologia de criptografia SSL atualizada em teu sistema. Portanto não é um extracto e não há nem mesmo uma máfia por trás dele. O site oferece a teus usuários boas medidas de segurança pra proteger a privacidade e as finanças.

Mostbet Rapid O Melhor Gambling Establishment E Site Sobre Apostas Online Perform Brasil

Seu site at the aplicativo são fáceis de navegar e têm dezenas sobre bônus disponíveis pra os jogadores. Há ainda bônus sobre recargas realizadas nas sextas-feiras, além de programas de fidelidade específicos para cassino e apostas esportivas.

  • A Mostbet Brasil tem teus próprios termos elizabeth condições, assim como os usuários devem lê-los electronic compreendê-los anteriormente a usar a plataforma.
  • A oferta é 1 pouco diferente carry out bônus de depósito padrão, pois é necessário atender primeiro ao requisito de de aposta.
  • Na Mostbet, os utilizadores encontram uma infinita variedade sobre jogos de online casino e apostas desportivas.
  • Têm se mostrado como um dos grandes sucessos ao redor da terra atual, e por isso você pode apostar nestes jogos excepcionalmente buscados na Mostbet País brasileiro.
  • Para arriesgar em esportes com Mostbet, você deverá criar sua conta, fazer um depósito, selecionar o esporte em que pretende apostar e aproveitar todos os mercados disponíveis.

Por exemplo, estão disponíveis alguns torneios dos seguintes jogos. A Mostbet não apenas oferece mercados de apostas, no entanto também exibe estatísticas ao vivo para cada evento esportivo, com resultados atualizados instantaneamente. Isso da voie que os jogadores analisem suas apostas de forma prática, sem ter os quais procurar informações em outros sites. Você pode apostar antes do início ag partida, acessando os mercados de apostas ao vivo. Outra forma comum para apostar, em os quais você faz suas apostas antes dos jogos, com mercados disponíveis até two dias antes perform evento.

Get In Contact