start_controls_section( 'section_content', [ 'label' => __( 'Display', 'elementor-extras' ), ] ); $this->add_control( 'source', [ 'label' => __( 'Query Source', 'elementor-extras' ), 'type' => Controls_Manager::SELECT, 'default' => '', 'options' => [ '' => __( 'Current Query', 'elementor-extras' ), 'id' => __( 'Custom Selection', 'elementor-extras' ), ] ] ); $this->add_control( 'source_id', [ 'label' => __( 'Page or Post', 'elementor-extras' ), 'type' => 'ee-query', 'query_type' => 'posts', 'label_block' => false, 'multiple' => false, 'condition' => [ 'source' => 'id', ], ] ); $this->add_control( 'show_home', [ 'label' => __( 'Show Home', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', ] ); $this->add_control( 'show_current', [ 'label' => __( 'Show Current', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', ] ); $this->add_control( 'structured_data', [ 'label' => __( 'Add Structured Data', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', ] ); $this->add_control( 'home_text', [ 'label' => __( 'Home Text', 'elementor-extras' ), 'type' => Controls_Manager::TEXT, 'default' => __( 'Homepage', 'elementor-extras' ), 'dynamic' => [ 'active' => true, 'categories' => [ TagsModule::POST_META_CATEGORY ] ], 'condition' => [ 'show_home' => 'yes' ], ] ); $this->end_controls_section(); $post_types = Utils::get_public_post_types_options( true, false ); foreach ( $post_types as $post_type => $label ) { $this->start_controls_section( 'section_single_' . $post_type, [ 'label' => sprintf( __( 'Single %s', 'elementor-extras' ), $label ), ] ); $this->add_control( 'single_' . $post_type . '_show_home', [ 'label' => __( 'Show Home', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', 'condition' => [ 'show_home!' => '', ], ] ); $this->add_control( 'single_' . $post_type . '_show_cpt', [ 'label' => __( 'Show Post Type', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', ] ); $taxonomies_options = Utils::get_taxonomies_options( $post_type ); foreach ( $taxonomies_options as $taxonomy => $label ) { if ( $taxonomy && ! is_taxonomy_hierarchical( $taxonomy ) ) { unset( $taxonomies_options[ $taxonomy ] ); } } $tax_options_default = ( $taxonomies_options && ! empty( $taxonomies_options[0] ) ) ? array_keys( $taxonomies_options )[0] : ''; $this->add_control( 'single_' . $post_type . '_show_terms', [ 'label' => __( 'Taxonomy', 'elementor-extras' ), 'type' => Controls_Manager::SELECT, 'default' => $tax_options_default, 'options' => array_merge( [ '' => __( 'None', 'elementor-extras' ), ], $taxonomies_options ), ] ); if ( is_post_type_hierarchical( $post_type ) ) { $this->add_control( 'single_' . $post_type . '_show_parents', [ 'label' => __( 'Show Parents', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', ] ); } $this->add_control( 'single_' . $post_type . '_show_current', [ 'label' => __( 'Show Current', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', 'condition' => [ 'show_current!' => '', ], ] ); $this->end_controls_section(); } $taxonomies = Utils::get_taxonomies_options(); foreach ( $taxonomies as $taxonomy => $label ) { $this->start_controls_section( 'section_taxonomy_' . $taxonomy, [ 'label' => sprintf( __( '%s Archive', 'elementor-extras' ), $label ), ] ); $this->add_control( 'taxonomy_' . $taxonomy . '_show_home', [ 'label' => __( 'Show Home', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', 'condition' => [ 'show_home!' => '', ], ] ); $this->add_control( 'taxonomy_' . $taxonomy . '_show_cpt', [ 'label' => __( 'Show Post Type', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'category' === $taxonomy || 'post_tag' === $taxonomy ? '' : 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', ] ); $this->add_control( 'taxonomy_' . $taxonomy . '_show_taxonomy', [ 'label' => __( 'Show Taxonomy', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'category' === $taxonomy || 'post_tag' === $taxonomy ? 'yes' : '', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', ] ); $this->add_control( 'taxonomy_' . $taxonomy . '_taxonomy_link', [ 'label' => __( 'Taxonomy Link', 'elementor-extras' ), 'type' => Controls_Manager::URL, 'placeholder' => esc_url( home_url( '/' ) ), 'dynamic' => [ 'active' => true ], 'label_block' => false, 'condition' => [ 'taxonomy_' . $taxonomy . '_show_taxonomy!' => '', ], ] ); if ( is_taxonomy_hierarchical( $taxonomy ) ) { $this->add_control( 'taxonomy_' . $taxonomy . '_show_parents', [ 'label' => sprintf( __( 'Show Parent %s', 'elementor-extras' ), $label ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', ] ); } $this->add_control( 'taxonomy_' . $taxonomy . '_show_current', [ 'label' => __( 'Show Current', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', 'condition' => [ 'show_current!' => '', ], ] ); $this->end_controls_section(); } $custom_post_types = Utils::get_public_post_types_options( true, false, [ 'public' => true, '_builtin' => false, ] ); if ( $custom_post_types ) { foreach ( $custom_post_types as $post_type => $label ) { $this->start_controls_section( 'section_cpt_' . $post_type, [ 'label' => sprintf( __( '%s Archive', 'elementor-extras' ), $label ), ] ); $this->add_control( 'cpt_' . $post_type . '_show_home', [ 'label' => __( 'Show Home', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', 'condition' => [ 'show_home!' => '', ], ] ); $this->add_control( 'cpt_' . $post_type . '_show_current', [ 'label' => __( 'Show Current', 'elementor-extras' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'label_on' => __( 'Yes', 'elementor-extras' ), 'label_off' => __( 'No', 'elementor-extras' ), 'return_value' => 'yes', 'condition' => [ 'show_current!' => '', ], ] ); $this->end_controls_section(); } } $this->start_controls_section( 'section_separator', [ 'label' => __( 'Separator', 'elementor-extras' ), ] ); $this->add_control( 'separator_type', [ 'label' => __( 'Type', 'elementor-extras' ), 'type' => Controls_Manager::SELECT, 'default' => 'icon', 'options' => [ 'text' => __( 'Text', 'elementor-extras' ), 'icon' => __( 'Icon', 'elementor-extras' ), ], ] ); $this->add_control( 'separator_text', [ 'label' => __( 'Text', 'elementor-extras' ), 'type' => Controls_Manager::TEXT, 'default' => __( '>', 'elementor-extras' ), 'condition' => [ 'separator_type' => 'text' ], ] ); $this->add_control( 'selected_separator_icon', [ 'label' => __( 'Icon', 'elementor-extras' ), 'type' => Controls_Manager::ICONS, 'fa4compatibility' => 'separator_icon', 'condition' => [ 'separator_type' => 'icon' ], 'default' => [ 'value' => 'fas fa-angle-right', 'library' => 'fa-solid', ], ] ); $this->end_controls_section(); $this->start_controls_section( 'section_item_style', [ 'label' => __( 'Crumbs', 'elementor-extras' ), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_responsive_control( 'items_align', [ 'label' => __( 'Align Crumbs', 'elementor-extras' ), 'type' => Controls_Manager::CHOOSE, 'default' => '', 'options' => [ 'left' => [ 'title' => __( 'Left', 'elementor-extras' ), 'icon' => 'eicon-h-align-left', ], 'center' => [ 'title' => __( 'Center', 'elementor-extras' ), 'icon' => 'eicon-h-align-center', ], 'right' => [ 'title' => __( 'Right', 'elementor-extras' ), 'icon' => 'eicon-h-align-right', ], 'stretch' => [ 'title' => __( 'Stretch', 'elementor-extras' ), 'icon' => 'eicon-h-align-stretch', ], ], 'prefix_class' => 'ee-breadcrumbs-align%s-', ] ); $this->add_responsive_control( 'items_text_align', [ 'label' => __( 'Align Text', 'elementor-extras' ), 'type' => Controls_Manager::CHOOSE, 'default' => '', 'options' => [ 'left' => [ 'title' => __( 'Left', 'elementor-extras' ), 'icon' => 'fa fa-align-left', ], 'center' => [ 'title' => __( 'Center', 'elementor-extras' ), 'icon' => 'fa fa-align-center', ], 'right' => [ 'title' => __( 'Right', 'elementor-extras' ), 'icon' => 'fa fa-align-right', ], ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs' => 'text-align: {{VALUE}};', ], ] ); $this->add_control( 'item_spacing', [ 'label' => __( 'Spacing', 'elementor-extras' ), 'type' => Controls_Manager::SLIDER, 'default' => [ 'size' => 12 ], 'range' => [ 'px' => [ 'max' => 36, ], ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs' => 'margin-left: -{{SIZE}}{{UNIT}};', '{{WRAPPER}} .ee-breadcrumbs__item' => 'margin-left: {{SIZE}}{{UNIT}};', '{{WRAPPER}} .ee-breadcrumbs__separator' => 'margin-left: {{SIZE}}{{UNIT}};', ], ] ); $this->add_control( 'item_padding', [ 'label' => __( 'Padding', 'elementor-extras' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', 'em', '%' ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'allowed_dimensions' => [ 'right', 'left' ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'item_border', 'label' => __( 'Border', 'elementor-extras' ), 'selector' => '{{WRAPPER}} .ee-breadcrumbs__item', ] ); $this->add_control( 'item_border_radius', [ 'label' => __( 'Border Radius', 'elementor-extras' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%' ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'item_typography', 'label' => __( 'Typography', 'elementor-extras' ), 'global' => [ 'default' => Global_Typography::TYPOGRAPHY_TEXT, ], 'selector' => '{{WRAPPER}} .ee-breadcrumbs__text', ] ); $this->start_controls_tabs( 'crumb_style' ); $this->start_controls_tab( 'crumb_default', [ 'label' => __( 'Default', 'elementor-extras' ) ] ); $this->add_control( 'item_background_color', [ 'label' => __( 'Background Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item' => 'background-color: {{VALUE}};', ], ] ); $this->add_control( 'item_color', [ 'label' => __( 'Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'global' => [ 'default' => Global_Colors::COLOR_ACCENT, ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item' => 'color: {{VALUE}};', '{{WRAPPER}} .ee-breadcrumbs__item a' => 'color: {{VALUE}};', ], ] ); $this->end_controls_tab(); $this->start_controls_tab( 'crumb_hover', [ 'label' => __( 'Hover', 'elementor-extras' ) ] ); $this->add_control( 'item_background_color_hover', [ 'label' => __( 'Background Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item:hover' => 'background-color: {{VALUE}};', ], ] ); $this->add_control( 'item_color_hover', [ 'label' => __( 'Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'default' => '', 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item:hover' => 'color: {{VALUE}};', '{{WRAPPER}} .ee-breadcrumbs__item:hover a' => 'color: {{VALUE}};', ], ] ); $this->end_controls_tab(); $this->end_controls_tabs(); $this->end_controls_section(); $this->start_controls_section( 'section_separator_style', [ 'label' => __( 'Separators', 'elementor-extras' ), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_control( 'separator_padding', [ 'label' => __( 'Padding', 'elementor-extras' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', 'em', '%' ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__separator' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'allowed_dimensions' => [ 'right', 'left' ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'separator_border', 'label' => __( 'Border', 'elementor-extras' ), 'selector' => '{{WRAPPER}} .ee-breadcrumbs__separator', ] ); $this->add_control( 'separator_border_radius', [ 'label' => __( 'Border Radius', 'elementor-extras' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%' ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__separator' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_control( 'separator_background_color', [ 'label' => __( 'Background Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__separator' => 'background-color: {{VALUE}};', ], ] ); $this->add_control( 'separator_color', [ 'label' => __( 'Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'default' => '', 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__separator' => 'color: {{VALUE}};', ], ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'separator_typography', 'label' => __( 'Typography', 'elementor-extras' ), 'selector' => '{{WRAPPER}} .ee-breadcrumbs__separator', ] ); $this->end_controls_section(); $this->start_controls_section( 'section_current_style', [ 'label' => __( 'Current', 'elementor-extras' ), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'current_border', 'label' => __( 'Border', 'elementor-extras' ), 'selector' => '{{WRAPPER}} .ee-breadcrumbs__item--current', ] ); $this->add_control( 'current_border_radius', [ 'label' => __( 'Border Radius', 'elementor-extras' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%' ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item--current' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_control( 'current_background_color', [ 'label' => __( 'Background Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item--current' => 'background-color: {{VALUE}};', ], ] ); $this->add_control( 'current_color', [ 'label' => __( 'Color', 'elementor-extras' ), 'type' => Controls_Manager::COLOR, 'global' => [ 'default' => Global_Colors::COLOR_TEXT, ], 'selectors' => [ '{{WRAPPER}} .ee-breadcrumbs__item--current' => 'color: {{VALUE}};', ], ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'current_typography', 'label' => __( 'Typography', 'elementor-extras' ), 'selector' => '{{WRAPPER}} .ee-breadcrumbs__item--current .ee-breadcrumbs__text', ] ); $this->end_controls_section(); } /** * Get Query * * @since 1.2.0 * @return \WP_Query|bool */ protected function get_query() { global $post; $settings = $this->get_settings_for_display(); $_id = null; $_post_type = 'post'; if ( 'id' === $settings['source'] && '' !== $settings['source_id'] ) { $_id = $settings['source_id']; $_post_type = 'any'; $_args = array( 'p' => $_id, 'post_type' => $_post_type, ); // Create custom query $_post_query = new \WP_Query( $_args ); return $_post_query; } return false; } /** * Set Separator * * Sets the markup for the breadcrumbs separator * * @since 1.2.0 * @return string */ protected function set_separator() { $settings = $this->get_settings_for_display(); $separator = ''; $has_icon = ! empty( $settings['separator_icon'] ) || ! empty( $settings['selected_separator_icon']['value'] ); if ( 'icon' === $settings['separator_type'] && $has_icon ) { $migrated = isset( $settings['__fa4_migrated']['selected_separator_icon'] ); $is_new = empty( $settings['icon'] ) && Icons_Manager::is_migration_allowed(); $this->add_render_attribute( 'icon-wrapper', 'class', [ 'ee-icon', 'ee-icon-support--svg', ] ); $separator .= 'get_render_attribute_string( 'icon-wrapper' ) . '>'; if ( $is_new || $migrated ) { ob_start(); Icons_Manager::render_icon( $settings['selected_separator_icon'], [ 'aria-hidden' => 'true' ] ); $separator .= ob_get_clean(); } else { $this->add_render_attribute( 'icon', [ 'class' => $settings['separator_icon'], 'aria-hidden' => 'true', ] ); $separator .= 'get_render_attribute_string('icon') . '>'; } $separator .= ''; } else { $this->add_inline_editing_attributes( 'separator_text' ); $this->add_render_attribute( 'separator_text', 'class', 'ee-breadcrumbs__separator__text' ); /** * Separator Text filter * * Filters the separator text if the separator is set as text * in the widget settings * * @since 2.2.0 * @param string $separator_text The separator text setting */ $separator_text = apply_filters( 'elementor_extras/widgets/breadcrumbs/separator/text', $settings['separator_text'] ); $separator = 'get_render_attribute_string( 'separator_text' ) . '>' . $separator_text . ''; } $this->_separator = $separator; } /** * Get Separator * * @since 1.2.0 * @return var\string */ protected function get_separator() { return $this->_separator; } /** * Render * * Render widget contents on frontend * * @since 1.2.0 * @return void */ protected function render() { $settings = $this->get_settings_for_display(); $_query = $this->get_query(); $this->set_separator(); $this->add_render_attribute( 'breadcrumbs', 'class', 'ee-breadcrumbs' ); if ( $settings['structured_data'] ) { $this->add_render_attribute( 'breadcrumbs', [ 'itemscope' => "", 'itemtype' => "http://schema.org/BreadcrumbList", ] ); } if ( $_query ) { if ( $_query->have_posts() ) { // Setup post $_query->the_post(); /** * Post Query Filter * * Filters the post query when breadcrumbs are set for a specific page * * @since 2.2.0 * @param WP_Query $_query The current query */ $_query = apply_filters( 'elementor_extras/widgets/breadcrumbs/query', $_query ); // Render using the new query $this->render_breadcrumbs( $_query ); // Reset post data to original query wp_reset_postdata(); wp_reset_query(); } else { _e( 'Post or page not found', 'elementor-extras' ); } } else { // Render using the original query $this->render_breadcrumbs(); } } /** * Render Separator * * The markup for the separator item * * @since 1.2.0 * @param bool $output Wether to echo or not the markup * @return void */ protected function render_separator( $output = true ) { $this->add_render_attribute( 'separator', [ 'class' => [ 'ee-breadcrumbs__separator', ], ] ); $separator = $this->get_separator(); /** * Separator filter * * Filters the separator * * @since 2.2.0 * @param string $post_title The markup for the separator */ $separator = apply_filters( 'elementor_extras/widgets/breadcrumbs/separator', $separator ); $markup = sprintf( '