sitepress = $sitepress; } /** * Add filters and actions. */ public function add_hooks() { if ( ! defined( 'ET_THEME_BUILDER_DIR' ) ) { return; } if ( $this->sitepress->is_setup_complete() ) { if ( is_admin() ) { add_action( 'init', [ $this, 'make_layouts_editable' ], 1000 ); // Before WPML_Sticky_Links::init. add_filter( 'wpml_document_view_item_link', [ $this, 'document_view_layout_link' ], 10, 5 ); } else { add_filter( 'get_post_metadata', [ $this, 'translate_layout_ids' ], 10, 4 ); } } } /** * Gets all post types that are layouts. */ private static function get_types() { return [ ET_THEME_BUILDER_HEADER_LAYOUT_POST_TYPE, ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE, ET_THEME_BUILDER_FOOTER_LAYOUT_POST_TYPE, ]; } /** * Access the global post types array to tweak the settings for layouts */ public function make_layouts_editable() { global $wp_post_types; foreach ( $this->get_types() as $type ) { $wp_post_types[ $type ]->show_ui = true; $wp_post_types[ $type ]->show_in_menu = false; $wp_post_types[ $type ]->_edit_link = 'post.php?post=%d'; } } /** * Translate theme builder layout ids in the frontend. * * @param string $value The layout id. * @param int $post_id The post it belongs to. * @param string $key The meta key we are handling. * @param bool $single Fetch a single row or an array. * @return string */ public function translate_layout_ids( $value, $post_id, $key, $single ) { if ( in_array( $key, [ '_et_header_layout_id', '_et_body_layout_id', '_et_footer_layout_id' ], true ) ) { /** * The `get_post_metadata` filter provides `null` as the initial `$value`. * When we return a different $value it is used directly, to avoid a second query. * This means that we have to get the original value first, removing ourselves so * we don't fall into an infinite loop. */ remove_filter( 'get_post_metadata', [ $this, 'translate_layout_ids' ], 10 ); $original_id = get_post_meta( $post_id, $key, true ); add_filter( 'get_post_metadata', [ $this, 'translate_layout_ids' ], 10, 4 ); $type = substr( $key, 1, -3 ); $value = $this->sitepress->get_object_id( $original_id, $type, true ); if ( ! $single ) { $value = [ $value ]; } } return $value; } /** * Remove the 'View' link because you can't view layouts alone. * * @param string $link The complete link. * @param string $text The text to link. * @param object $job The corresponding translation job. * @param string $prefix The prefix of the element type. * @param string $type The element type. * * @return string */ public function document_view_layout_link( $link, $text, $job, $prefix, $type ) { if ( 'post' === $prefix && $this->is_theme_layout( $type ) ) { $link = ''; } return $link; } /** * Check if a certain Type is a theme builder layout. * * @param string $type The type to check. * * @return bool */ private function is_theme_layout( $type ) { return in_array( $type, $this->get_types(), true ); } }