translate( 'title', $title, $presentation ); } /** * Translates a description. * * @param string $description The description in the default language. * @param Indexable_Presentation $presentation The presentation class. * * @return string */ public function translateDescription( $description, $presentation ) { $type = $this->isHomePageObjectType( $presentation ) ? 'desc' : 'metadesc'; return $this->translate( $type, $description, $presentation ); } /** * Translates a breadcrumb title. * * @param string $title The title in the default language. * @param Indexable_Presentation $presentation The presentation class. * * @return string */ public function translateBreadcrumbTitle( $title, $presentation ) { return $this->translate( 'bctitle', $title, $presentation ); } /** * Get the translations from the options table, which will include the translated admin-texts. * * @param string $type The object type of the Indesable, used as a prefix for the option name. * @param string $text The text in the default language. * @param Indexable_Presentation $presentation The presentation class. * * @return string */ private function translate( $type, $text, $presentation ) { $optionName = $this->getOptionName( $presentation ); $optionKey = $this->getOptionKey( $type, $presentation ); if ( $optionName && $optionKey ) { $option = get_option( $optionName ); if ( isset( $option[ $optionKey ] ) ) { $text = wpseo_replace_vars( $option[ $optionKey ], $presentation ); } } return $text; } /** * Returns the option name for the object being translated. * * @param Indexable_Presentation $presentation The presentation class. * * @return string */ private function getOptionName( $presentation ) { return $this->isHomePageObjectType( $presentation ) ? 'wpseo_social' : 'wpseo_titles'; } /** * Returns the option key for the object being translated. * * @param string $type How to prefix the option name. * @param Indexable_Presentation $presentation The presentation class. * * @return string */ private function getOptionKey( $type, $presentation ) { return wpml_collect( [ 'post-type-archive' => $type . '-ptarchive-' . $presentation->model->object_sub_type, 'system-page' => $type . '-' . $presentation->model->object_sub_type . '-wpseo', 'home-page' => 'og_frontpage_' . $type, ] )->get( $presentation->model->object_type, false ); } /** * Returns true if we are we handling the home page. * * @param Indexable_Presentation $presentation The presentation class. * * @return bool */ private function isHomePageObjectType( $presentation ) { return 'home-page' === $presentation->model->object_type; } /** * Translate titles and links for home and archives. * * @param Indexable[] $indexables An array of Indexable objects representing the breacrumbs. * * @return Indexable[] */ public function translateBreadcrumbs( $indexables ) { foreach ( $indexables as &$indexable ) { if ( 'post-type-archive' === $indexable->object_type ) { $indexable->breadcrumb_title = $this->translateBreadcrumbTitle( $indexable->breadcrumb_title, (object) [ 'model' => $indexable ] ); } if ( 'term' === $indexable->object_type ) { $term = apply_filters( 'wpml_object_id', $indexable->object_id, $indexable->object_sub_type, true ); $indexable->permalink = get_term_link( $term ); $indexable->breadcrumb_title = get_term( $term )->name; } else { $indexable->permalink = apply_filters( 'wpml_permalink', $indexable->permalink ); } } return $indexables; } /** * Translate permalinks. * * @param Indexable_Presention $presentation The indexable presentation. * * @return Indexable_Presention */ public function translatePermalinks( $presentation ) { $presenttion = clone $presentation; if ( 'post' === $presentation->model->object_type ) { $presentation->model->permalink = get_permalink( $presentation->model->object_id ); } elseif ( 'term' === $presentation->model->object_type ) { $presentation->model->permalink = get_term_link( $presentation->model->object_id ); } return $presentation; } }