WordPress.org

Making WordPress.org

Ticket #1692: inject-translated-meta-keys.diff

File inject-translated-meta-keys.diff, 3.5 KB (added by tellyworth, 19 months ago)
  • class-plugin-directory.php

     
    1010class Plugin_Directory { 
    1111 
    1212        /** 
     13         * Local cache for translated content injected into meta 
     14         */ 
     15        private $i18n_meta = array(); 
     16 
     17        /** 
    1318         * Fetch the instance of the Plugin_Directory class. 
    1419         */ 
    1520        public static function instance() { 
     
    226231                        require_once( __DIR__ . '/libs/site-search/jetpack-search.php' ); 
    227232                        \Jetpack_Search::instance(); 
    228233                } 
     234 
     235                // When Jetpack syncs, we want to add filters to inject additional metadata for Jetpack, so it syncs for ElasticSearch indexing. 
     236                add_action( 'shutdown', array( $this, 'append_meta_for_jetpack' ), 8 ); 
     237 
    229238        } 
    230239 
    231240        /** 
     
    453462                if ( is_null( $section ) ) { 
    454463                        return $content; 
    455464                } 
     465 
    456466                return Plugin_i18n::instance()->translate( $section, $content ); 
    457467        } 
    458468 
     
    480490        } 
    481491 
    482492        /** 
     493         * Shutdown action that will add a filter to inject additional postmeta containing translated content if Jetpack is syncing. 
     494         * 
     495         */ 
     496        public function append_meta_for_jetpack() { 
     497                // TEMP: only do this for low numbered plugin IDs, till we're sure it works. 
     498                if ( get_post()->ID > 200 ) 
     499                        return; 
     500 
     501                // Guess if a Jetpack sync is scheduled to run. It runs during shutdown at a lower priority than this action, so we can get in first. 
     502                // Fetching the extra meta to inject is expensive, so we only want to do this if a sync is likely. 
     503                if ( class_exists( 'Jetpack' ) && !empty(\Jetpack::init()->sync->sync) ) { 
     504                        add_filter( 'wporg_plugins_custom_meta_fields', array( $this, 'filter_post_meta_i18n' ), 10, 2 ); 
     505                } 
     506 
     507        } 
     508 
     509        /** 
     510         * Filter for wporg_plugins_custom_meta_fields to inject translated content for ES. 
     511         * 
     512         * @param array $meta 
     513         * @param int $post_id 
     514         * @return array 
     515         */ 
     516        public function filter_post_meta_i18n( $meta, $post_id ) { 
     517                // Prevent recursion and repeat runs 
     518                remove_filter( 'wporg_plugins_custom_meta_fields', array( $this, 'filter_post_meta_i18n' ) ); 
     519 
     520                if ( get_post()->ID == $post_id ) { 
     521                        $locales_to_sync = array( 'fr_fr', 'es_es' ); // This should probably be a list of available translations for the plugin readme. 
     522 
     523                        global $locale; 
     524                        $_locale = $locale; 
     525                        foreach ( $locales_to_sync as $locale ) { 
     526                                $this->i18n_meta[$post_id]['post_title_'.$locale] = $this->translate_post_title( get_the_title(), $post_id ); 
     527                                $this->i18n_meta[$post_id]['post_excerpt_'.$locale] = $this->translate_post_excerpt( get_the_excerpt() ); 
     528 
     529                                // Split up the content to translate it in sections 
     530                                $content = ''; 
     531                                $sections = $this->split_post_content_into_pages( get_the_content() ); 
     532                                foreach ( $sections as $section => $section_content ) 
     533                                        $content .= $this->translate_post_content( $section_content, $section ); 
     534                                $this->i18n_meta[$post_id]['post_content_'.$locale] = $content; 
     535 
     536                        } 
     537 
     538                        $locale = $_locale; 
     539 
     540                        $meta = array_merge( $meta, array_keys( $this->i18n_meta[$post_id] ) ); 
     541                } 
     542 
     543                add_filter( 'wporg_plugins_custom_meta_fields', array( $this, 'filter_post_meta_i18n'), 10, 2 ); 
     544                return $meta; 
     545        } 
     546 
     547 
     548        /** 
    483549         * Filter for rest_api_allowed_post_types to enable JP syncing of the CPT 
    484550         * 
    485551         * @param array $allowed_post_types 
     
    576642                                } 
    577643 
    578644                                break; 
     645                        default: 
     646                                if ( isset( $this->i18n_meta[ $object_id ][ $meta_key ] ) ) 
     647                                        return array( $this->i18n_meta[ $object_id ][ $meta_key ] ); 
     648                                break; 
    579649                } 
    580650                return $value; 
    581651        }