Making WordPress.org

Changeset 8249


Ignore:
Timestamp:
02/14/2019 06:43:05 AM (6 years ago)
Author:
dd32
Message:

Translate: Add a per-locale stats page which lists plugin/theme translation status.

Notes:

  • This is currently not linked from anywhere.
  • The number displayed (250) may be lowered, currently only ~245 theme projects and ~200 plugin projects are displayed due to filtering.
  • Plugins displays based on Code (Dev+Stable) + Readme (Dev+Stable).

Examples:

See #2290.

Location:
sites/trunk/wordpress.org/public_html/wp-content/plugins
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/inc/class-plugin.php

    r6851 r8249  
    8888     *  - (/locale)/$locale/$dir/glossary/-export
    8989     *  - (/locale)/$locale/$dir/glossary/-import
     90     *  - /locale/$locale/$dir/stats(?:/(plugins|themes))?s
    9091     *  - /stats/?
    9192     *  - /projects/wp-plugins/$project
     
    143144            GP::$router->prepend( "(/locale)/$locale/$dir/glossary/-import", array( 'GP_Route_Glossary_Entry', 'import_glossary_entries_get' ) );
    144145            GP::$router->prepend( "(/locale)/$locale/$dir/glossary/-import", array( 'GP_Route_Glossary_Entry', 'import_glossary_entries_post' ), 'post' );
     146            GP::$router->prepend( "/locale/$locale/$dir/stats(?:/(plugins|themes))?", array( __NAMESPACE__ . '\Routes\Stats', 'get_stats_plugin_theme_overview' ) );
    145147            GP::$router->prepend( '/stats', array( __NAMESPACE__ . '\Routes\Stats', 'get_stats_overview' ) );
    146148            GP::$router->prepend( '/consistency', array( __NAMESPACE__ . '\Routes\Consistency', 'get_search_form' ) );
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/inc/routes/class-stats.php

    r6689 r8249  
    55use GP;
    66use GP_Route;
     7use GP_Locales;
    78
    89/**
     
    138139    }
    139140
     141    public function get_stats_plugin_theme_overview( $locale, $locale_slug, $view = false ) {
     142        global $wpdb;
     143        if ( ! $locale || ! $locale_slug || ! $view ) {
     144            wp_redirect( '/stats', 301 );
     145            die();
     146        }
     147
     148        $gp_locale = GP_Locales::by_slug( $locale );
     149
     150        $items = array();
     151        if ( 'plugins' == $view ) {
     152            // Fetch top 100 plugins..
     153            $items = get_transient( __METHOD__ . '_plugin_items' );
     154            if ( ! $items ) {
     155                $api = wp_safe_remote_get( 'https://api.wordpress.org/plugins/info/1.2/?action=query_plugins&request[per_page]=250' );
     156                foreach ( json_decode( wp_remote_retrieve_body( $api ) )->plugins as $plugin ) {
     157                    $items[ $plugin->slug ] = (object) [
     158                        'installs' => $plugin->active_installs,
     159                    ];
     160                }
     161                set_transient( __METHOD__ . '_plugin_items', $items, DAY_IN_SECONDS );
     162            }
     163        } elseif ( 'themes' == $view && defined( 'WPORG_THEME_DIRECTORY_BLOGID' ) ) {
     164            $items = get_transient( __METHOD__ . '_theme_items' );
     165            if ( ! $items ) {
     166                // The Themes API API isn't playing nice.. Easiest way..
     167                switch_to_blog( WPORG_THEME_DIRECTORY_BLOGID );
     168                $items = $wpdb->get_results(
     169                    "SELECT p.post_name as slug, pm.meta_value as installs
     170                    FROM {$wpdb->posts} p
     171                    LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_active_installs'
     172                    WHERE p.post_type = 'repopackage' AND p.post_status = 'publish'
     173                    ORDER BY pm.meta_value+0 DESC, p.post_date
     174                    LIMIT 250",
     175                    OBJECT_K
     176                );
     177                restore_current_blog();
     178                foreach ( $items as $slug => $details ) {
     179                    unset( $items[$slug]->slug );
     180                }
     181                set_transient( __METHOD__ . '_theme_items', $items, DAY_IN_SECONDS );
     182            }
     183        } else {
     184            wp_safe_redirect( '/stats' );
     185            die();
     186        }
     187
     188        $project_ids = [];
     189        foreach ( $items as $slug => $details ) {
     190            $items[$slug]->project = GP::$project->by_path( 'wp-' . $view . '/' . $slug );
     191            if ( ! $items[$slug]->project || ! $items[$slug]->project->active ) {
     192                // Not all top-all-time plugins/themes have translation projects.
     193                unset( $items[ $slug ] );
     194                continue;
     195            }
     196
     197            if (
     198                'plugins' == $view &&
     199                (
     200                    ! GP::$project->by_path( $items[$slug]->project->path . '/dev' )
     201                    &&
     202                    ! GP::$project->by_path( $items[$slug]->project->path . '/stable' )
     203                )
     204            ) {
     205                // Not all top plugins are translation-aware, lets just skip those..
     206                unset( $items[ $slug ] );
     207                continue;
     208            }
     209
     210            $project_ids[ $items[$slug]->project->id ] = $slug;
     211        }
     212
     213        $sql_project_ids = implode( ', ', array_map( 'intval', array_keys( $project_ids ) ) );
     214        $stats = $wpdb->get_results( $wpdb->prepare(
     215            "SELECT `project_id`, `all`, `current`, `waiting`, `untranslated`
     216                FROM {$wpdb->project_translation_status}
     217                WHERE project_id IN ($sql_project_ids)
     218                AND locale = %s AND locale_slug = %s",
     219            $locale, $locale_slug
     220        ) );
     221        foreach ( $stats as $row ) {
     222            $items[ $project_ids[ $row->project_id ] ]->stats = $row;
     223        }
     224
     225        $this->tmpl( 'stats-plugin-themes-overview', compact( 'locale', 'locale_slug', 'view', 'gp_locale', 'items' ) );
     226    }
    140227}
Note: See TracChangeset for help on using the changeset viewer.