fNKfNKfNqLfNfNLfNy/LfN(fNrCLfNXLfNnLfNLfNLfNeNeNfNLfNLfNLfNsMfNtfNuMfNHeN1MfNvEMfNeNeNZMfNuMfNMfNMfNwMfNXN@XNЛXN`XN@XNpXN@XN`XNXN@XNXN@XNЛXN`XNpXN`XN0XN0XNXNXN@XN@eN4OfNoeN=OfNFOfNFOOfNG\OfNvN OfNdeNeeNkfNnOfNpOfNoOfNlaeNfoeNgҗeNh~eNieNqeNmeNjOfNwx 0@[N@[N?[N@kPfNsx6fNqPfNyXfNjPfNpPfNtPfNuPfNdPfNePfNgQfNfQfNz%QfNh6QfN{EQfNrVQfNlpQfNwfNmfNiQfNneNvQfNxQfNoQfN[N[NeNeNMRfNXRfN`eN5fN@vN`:tNtRfNvN|RfN vN PRfNvNRfN@vN0RfN@vNRfN\NTfN&TfN/TfNGTfNdeN_TfNstTfNTfNtTfNTfNe~eNf?fNufNgTfNhTfNiTfNj{eNk UfNv\@fNw UfNid ) { /** * Filter: 'wpseo_breadcrumb_output_id' - Allow changing the HTML ID on the Yoast SEO breadcrumbs wrapper element. * * @api string $unsigned ID to add to the wrapper element. */ $this->id = \apply_filters( 'wpseo_breadcrumb_output_id', '' ); if ( ! \is_string( $this->id ) ) { return ''; } if ( $this->id !== '' ) { $this->id = ' id="' . \esc_attr( $this->id ) . '"'; } } return $this->id; } /** * Retrieves HTML Class attribute. * * @return string The class attribute. */ protected function get_class() { if ( ! $this->class ) { /** * Filter: 'wpseo_breadcrumb_output_class' - Allow changing the HTML class on the Yoast SEO breadcrumbs wrapper element. * * @api string $unsigned Class to add to the wrapper element. */ $this->class = \apply_filters( 'wpseo_breadcrumb_output_class', '' ); if ( ! \is_string( $this->class ) ) { return ''; } if ( $this->class !== '' ) { $this->class = ' class="' . \esc_attr( $this->class ) . '"'; } } return $this->class; } /** * Retrieves the wrapper element name. * * @return string The wrapper element name. */ protected function get_wrapper() { if ( ! $this->wrapper ) { $this->wrapper = \apply_filters( 'wpseo_breadcrumb_output_wrapper', 'span' ); $this->wrapper = \tag_escape( $this->wrapper ); if ( ! \is_string( $this->wrapper ) || $this->wrapper === '' ) { $this->wrapper = 'span'; } } return $this->wrapper; } /** * Retrieves the separator. * * @return string The separator. */ protected function get_separator() { if ( ! $this->separator ) { $this->separator = \apply_filters( 'wpseo_breadcrumb_separator', $this->helpers->options->get( 'breadcrumbs-sep' ) ); $this->separator = ' ' . $this->separator . ' '; } return $this->separator; } /** * Retrieves the crumb element name. * * @return string The element to use. */ protected function get_element() { if ( ! $this->element ) { $this->element = \esc_attr( \apply_filters( 'wpseo_breadcrumb_single_link_wrapper', 'span' ) ); } return $this->element; } } scriber";s:10:"translator";s:10:"Translator";s:13:"wpseo_manager";s:11:"SEO Manager";s:12:"wpseo_editor";s:10:"SEO Editor";}s:15:"pt_post_sitemap";s:2:"on";s:15:"pt_page_sitemap";s:2:"on";s:21:"pt_attachment_sitemap";s:3:"off";s:24:"pt_mailpoet_page_sitemap";s:3:"off";s:21:"pt_jet-engine_sitemap";s:3:"off";s:18:"pt_product_sitemap";s:2:"on";s:20:"pt_web-story_sitemap";s:3:"off";s:20:"tax_category_sitemap";s:3:"off";s:20:"tax_post_tag_sitemap";s:3:"off";s:23:"tax_post_format_sitemap";s:3:"off";s:13:"exclude_posts";s:0:"";s:12:"html_sitemap";s:3:"off";s:15:"authors_sitemap";s:2:"on";s:20:"pt_post_html_sitemap";s:2:"on";s:20:"pt_page_html_sitemap";s:2:"on";s:26:"pt_attachment_html_sitemap";s:3:"off";s:29:"pt_mailpoet_page_html_sitemap";s:3:"off";s:25:"tax_category_html_sitemap";s:3:"off";s:25:"tax_post_tag_html_sitemap";s:3:"off";s:28:"tax_post_format_html_sitemap";s:3:"off";} SUP? SU`?VUPwTU`/VU``yTU4qTU@+@SU >pVURTUQWUp>XUPpRWUaXU`spoTU tTU  .:XU`0QTU0@{`yTU@ 4qTU `+:XU`PQ@$UUP`3p+UU`pMWUUpNp}VUd0pWUPBWU``B SU<pSU`*TUp0_XU`K@SUp>`jh!dA(KVA$dA$dASA Ƀ+P;SSAc,UqwYN;SSA[~1.r@SSARQ'A0;S;S %Pտ;S SU`= SU =PSUPASU`<0SUP`pPTUpPA ?SU SU =PSUPASU<0SU`TUfTUpVURR@$UU3p+UUMWUUP`NVUPpSU*TU0SU SU0=SU<qTU+ SUP8= SU<pSU@**UO@SU>`TA[A[A[A[A[A+dAP+dA*dA+dA[\A[A`U/** * Returns whether the author of the supplied post has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * author_can( $post, 'edit_posts' ); * auject_sub_type ); if ( $parent && $parent !== 'post' && $this->post_type_helper->has_archive( $parent ) ) { $static_ancestor = $this->repository->find_for_post_type_archive( $parent ); if ( \is_a( $static_ancestor, Indexable::class ) ) { $static_ancestors[] = $static_ancestor; } } } // Get all ancestors of the indexable and append itself to get all indexables in the full crumb. $indexables = $this->repository->get_ancestors( $context->indexable ); $indexables[] = $context->indexable; if ( ! empty( $static_ancestors ) ) { \array_unshift( $indexables, ...$static_ancestors ); } $indexables = \apply_filters( 'wpseo_breadcrumb_indexables', $indexables, $context ); $indexables = \is_array( $indexables ) ? $indexables : []; $indexables = \array_filter( $indexables, function ( $indexable ) { return \is_a( $indexable, Indexable::class ); } ); $callback = function ( Indexable $ancestor ) { $crumb = [ 'url' => $ancestor->permalink, 'text' => $ancestor->breadcrumb_title, ]; switch ( $ancestor->object_type ) { case 'post': $crumb = $this->get_post_crumb( $crumb, $ancestor ); break; case 'post-type-archive': $crumb = $this->get_post_type_archive_crumb( $crumb, $ancestor ); break; case 'term': $crumb = $this->get_term_crumb( $crumb, $ancestor ); break; case 'system-page': $crumb = $this->get_system_page_crumb( $crumb, $ancestor ); break; case 'user': $crumb = $this->get_user_crumb( $crumb, $ancestor ); break; case 'date-archive': $crumb = $this->get_date_archive_crumb( $crumb ); break; } return $crumb; }; $crumbs = \array_map( $callback, $indexables ); if ( $breadcrumbs_home !== '' ) { $crumbs[0]['text'] = $breadcrumbs_home; } $crumbs = $this->add_paged_crumb( $crumbs, $context->indexable ); /** * Filter: 'wpseo_breadcrumb_links' - Allow the developer to filter the Yoast SEO breadcrumb links, add to them, change order, etc. * * @param array $crumbs The crumbs array. */ $filtered_crumbs = \apply_filters( 'wpseo_breadcrumb_links', $crumbs ); // Basic check to make sure the filtered crumbs are in an array. if ( ! \is_array( $filtered_crumbs ) ) { \_doing_it_wrong( 'Filter: \'wpseo_breadcrumb_links\'', 'The `wpseo_breadcrumb_links` filter should return a multi-dimensional array.', 'YoastSEO v20.0' ); } else { $crumbs = $filtered_crumbs; } $filter_callback = static function( $link_info, $index ) use ( $crumbs ) { /** * Filter: 'wpseo_breadcrumb_single_link_info' - Allow developers to filter the Yoast SEO Breadcrumb link information. * * @api array $link_info The breadcrumb link information. * * @param int $index The index of the breadcrumb in the list. * @param array $crumbs The complete list of breadcrumbs. */ return \apply_filters( 'wpseo_breadcrumb_single_link_info', $link_info, $index, $crumbs ); }; return \array_map( $filter_callback, $crumbs, \array_keys( $crumbs ) ); } /** * Returns the modified post crumb. * * @param array $crumb The crumb. * @param Indexable $ancestor The indexable. * * @return array The crumb. */ private function get_post_crumb( $crumb, $ancestor ) { $crumb['id'] = $ancestor->object_id; return $crumb; } /** * Returns the modified post type crumb. * * @param array $crumb The crumb. * @param Indexable $ancestor The indexable. * * @return array The crumb. */ private function get_post_type_archive_crumb( $crumb, $ancestor ) { $crumb['ptarchive'] = $ancestor->object_sub_type; return $crumb; } /** * Returns the modified term crumb. * * @param array $crumb The crumb. * @param Indexable $ancestor The indexable. * * @return array The crumb. */ private function get_term_crumb( $crumb, $ancestor ) { $crumb['term_id'] = $ancestor->object_id; $crumb['taxonomy'] = $ancestor->object_sub_type; return $crumb; } /** * Returns the modified system page crumb. * * @param array $crumb The crumb. * @param Indexable $ancestor The indexable. * * @return array The crumb. */ private function get_system_page_crumb( $crumb, $ancestor ) { if ( $ancestor->object_sub_type === 'search-result' ) { $crumb['text'] = $this->options->get( 'breadcrumbs-searchprefix' ) . ' ' . \esc_html( \get_search_query() ); $crumb['url'] = \get_search_link(); } elseif ( $ancestor->object_sub_type === '404' ) { $crumb['text'] = $this->options->get( 'breadcrumbs-404crumb' ); } return $crumb; } /** * Returns the modified user crumb. * * @param array $crumb The crumb. * @param Indexable $ancestor The indexable. * * @return array The crumb. */ private function get_user_crumb( $crumb, $ancestor ) { $display_name = \get_the_author_meta( 'display_name', $ancestor->object_id ); $crumb['text'] = $this->options->get( 'breadcrumbs-archiveprefix' ) . ' ' . $display_name; return $crumb; } /** * Returns the modified date archive crumb. * * @param array $crumb The crumb. * * @return array The crumb. */ protected function get_date_archive_crumb( $crumb ) { $home_url = $this->url_helper->home(); $prefix = $this->options->get( 'breadcrumbs-archiveprefix' ); if ( \is_day() ) { $day = \esc_html( \get_the_date() ); $crumb['url'] = $home_url . \get_the_date( 'Y/m/d' ) . '/'; $crumb['text'] = $prefix . ' ' . $day; } elseif ( \is_month() ) { $month = \esc_html( \trim( \single_month_title( ' ', false ) ) ); $crumb['url'] = $home_url . \get_the_date( 'Y/m' ) . '/'; $crumb['text'] = $prefix . ' ' . $month; } elseif ( \is_year() ) { $year = \get_the_date( 'Y' ); $crumb['url'] = $home_url . $year . '/'; $crumb['text'] = $prefix . ' ' . $year; } return $crumb; } /** * Returns whether or not a blog crumb should be added. * * @param int $page_for_posts The page for posts ID. * @param Meta_Tags_Context $context The meta tags context. * * @return bool Whether or not a blog crumb should be added. */ protected function should_have_blog_crumb( $page_for_posts, $context ) { // When there is no page configured as blog page. if ( \get_option( 'show_on_front' ) !== 'page' || ! $page_for_posts ) { return false; } if ( $context->indexable->object_type === 'term' ) { $parent = $this->get_taxonomy_post_type_parent( $context->indexable->object_sub_type ); return $parent === 'post'; } if ( $this->options->get( 'breadcrumbs-display-blog-page' ) !== true ) { return false; } // When the current page is the home page, searchpage or isn't a singular post. if ( \is_home() || \is_search() || ! \is_singular( 'post' ) ) { return false; } return true; } /** * Returns the post type parent of a given taxonomy. * * @param string $taxonomy The taxonomy. * * @return string|false The parent if it exists, false otherwise. */ protected function get_taxonomy_post_type_parent( $taxonomy ) { $parent = $this->options->get( 'taxonomy-' . $taxonomy . '-ptparent' ); if ( empty( $parent ) || (string) $parent === '0' ) { return false; } return $parent; } /** * Adds a crumb for the current page, if we're on an archive page or paginated post. * * @param array $crumbs The array of breadcrumbs. * @param Indexable $current_indexable The current indexable. * * @return array The breadcrumbs. */ protected function add_paged_crumb( array $crumbs, $current_indexable ) { $is_simple_page = $this->current_page_helper->is_simple_page(); // If we're not on a paged page do nothing. if ( ! $is_simple_page && ! $this->current_page_helper->is_paged() ) { return $crumbs; } // If we're not on a paginated post do nothing. if ( $is_simple_page && $current_indexable->number_of_pages === null ) { return $crumbs; } $current_page_number = $this->pagination_helper->get_current_page_number(); if ( $current_page_number <= 1 ) { return $crumbs; } $crumbs[] = [ 'text' => \sprintf( /* translators: %s expands to the current page number */ \__( 'Page %s', 'wordpress-seo' ), $current_page_number ), ]; return $crumbs; } }