WordPress.org

Making WordPress.org

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

File inject-translated-meta-keys.diff, 3.5 KB (added by tellyworth, 2 years 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        }