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 */ protected function add_terms( $data, $key, $taxonomy ) { $terms = \get_the_terms( $this->context->id, $taxonomy ); if ( ! \is_array( $terms ) ) { return $data; } $callback = static function( $term ) { // We are using the WordPress internal translation. return $term->name !== \__( 'Uncategorized', 'default' ); }; $terms = \array_filter( $terms, $callback ); if ( empty( $terms ) ) { return $data; } $data[ $key ] = \wp_list_pluck( $terms, 'name' ); return $data; } /** * Adds an image node if the post has a featured image. * * @param array $data The Article data. * * @return array The Article data. */ private function add_image( $data ) { if ( $this->context->main_image_url !== null ) { $data['image'] = [ '@id' => $this->context->canonical . Schema_IDs::PRIMARY_IMAGE_HASH, ]; $data['thumbnailUrl'] = $this->context->main_image_url; } return $data; } /** * Adds the potential action property to the Article Schema piece. * * @param array $data The Article data. * * @return array The Article data with the potential action added. */ private function add_potential_action( $data ) { /** * Filter: 'wpseo_schema_article_potential_action_target' - Allows filtering of the schema Article potentialAction target. * * @api array $targets The URLs for the Article potentialAction target. */ $targets = \apply_filters( 'wpseo_schema_article_potential_action_target', [ $this->context->canonical . '#respond' ] ); $data['potentialAction'][] = [ '@type' => 'CommentAction', 'name' => 'Comment', 'target' => $targets, ]; return $data; } /** * Does a simple word count but tries to be relatively smart about it. * * @param string $post_content The post content. * @param string $post_title The post title. * * @return int The number of words in the content. */ private function word_count( $post_content, $post_title = '' ) { // Add the title to our word count. $post_content = $post_title . ' ' . $post_content; // Strip pre/code blocks and their content. $post_content = \preg_replace( '@<(pre|code)[^>]*?>.*?@si', '', $post_content ); // Add space between tags that don't have it. $post_content = \preg_replace( '@><@', '> <', $post_content ); // Strips all other tags. $post_content = \wp_strip_all_tags( $post_content ); $characters = ''; if ( \preg_match( '@[а-я]@ui', $post_content ) ) { // Correct counting of the number of words in the Russian and Ukrainian languages. $alphabet = [ 'ru' => 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя', 'ua' => 'абвгґдеєжзиіїйклмнопрстуфхцчшщьюя', ]; $characters = \implode( '', $alphabet ); $characters = \preg_split( '//u', $characters, -1, \PREG_SPLIT_NO_EMPTY ); $characters = \array_unique( $characters ); $characters = \implode( '', $characters ); $characters .= \mb_strtoupper( $characters ); } // Remove characters from HTML entities. $post_content = \preg_replace( '@&[a-z0-9]+;@i', ' ', \htmlentities( $post_content ) ); return \str_word_count( $post_content, 0, $characters ); } }