WordPress.org

Making WordPress.org

Ticket #152: 152.patch

File 152.patch, 18.6 KB (added by SergeyBiryukov, 3 years ago)
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-bbp-version-dropdown/inc/class-plugin.php

     
    99         */
    1010        private static $instance;
    1111
    12         const META_KEY = 'wp_version';
     12        const META_KEY         = 'wp_version';
     13        const PROJECT_META_KEY = 'project_version';
    1314
    1415        /**
    1516         * Returns always the same instance of this plugin.
     
    5152        }
    5253
    5354        /**
    54          * Output value topic version dropdown
     55         * Output version dropdown values for the topic.
    5556         */
    5657        public function form_topic_version_dropdown() {
    57                 $version = 0;
    58                 $other_version = '';
    59                 $versions = $this->get_wp_versions();
     58                $wp_version = 0;
     59                $wp_other_version = '';
     60                $wp_versions = $this->get_wp_versions();
    6061
    6162                // Post value passed
    6263                if ( bbp_is_topic_form_post_request() && isset( $_POST[ self::META_KEY ] ) ) {
    63                         $version = $this->sanitize_wp_version( $_POST[ self::META_KEY ] );
     64                        $wp_version = $this->sanitize_version( $_POST[ self::META_KEY ] );
    6465
    6566                // No post value passed
    6667                } else if ( bbp_is_single_topic() || bbp_is_topic_edit() ) {
    67                         $version = $this->get_topic_version( array( 'id' => bbp_get_topic_id() ) );
    68                         if ( false === $version ) {
    69                                 $version = 0;
     68                        $topic_versions = $this->get_topic_version( array( 'id' => bbp_get_topic_id() ) );
     69                        $wp_version     = $topic_versions['wp_version'];
     70
     71                        if ( false === $wp_version ) {
     72                                $wp_version = 0;
    7073                        }
    7174                }
    7275
    73                 if ( ! empty( $version ) && ! array_key_exists( $version, $versions ) ) {
    74                         $other_version = $version;
    75                         $version = 'other';
     76                if ( ! empty( $wp_version ) && ! array_key_exists( $wp_version, $wp_versions ) ) {
     77                        $wp_other_version = $wp_version;
     78                        $wp_version = 'other';
    7679                }
    7780                ?>
    7881                <p>
    79                         <label for="wp-version"><?php esc_html_e( 'Version:', 'wporg-forums' ); ?></label><br />
     82                        <label for="wp-version"><?php esc_html_e( 'WordPress Version:', 'wporg-forums' ); ?></label><br />
    8083                        <em><?php esc_html_e( 'Select the version of WordPress you are using.', 'wporg-forums' ); ?></em><br />
    8184
    8285                        <select name="<?php echo esc_attr( self::META_KEY ); ?>" id="wp-version">
    83                                 <?php foreach ( $versions as $key => $label ) : ?>
    84                                         <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $version ); ?>><?php echo esc_html( $label ); ?></option>
     86                                <?php foreach ( $wp_versions as $key => $label ) : ?>
     87                                        <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $wp_version ); ?>><?php echo esc_html( $label ); ?></option>
    8588                                <?php endforeach; ?>
    8689                        </select>
    8790
    88                         <label for="wp-other-version"><?php esc_html_e( 'Enter a different WordPress version here:', 'wporg-forums' ); ?></label>
    89                         <input type="text" name="wp_other_version" id="wp-other-version" value="<?php echo esc_attr( $other_version ); ?>">
     91                        <label for="wp-other-version"><?php esc_html_e( 'Enter a different version here:', 'wporg-forums' ); ?></label>
     92                        <input type="text" name="wp_other_version" id="wp-other-version" value="<?php echo esc_attr( $wp_other_version ); ?>">
    9093                </p>
    9194                <?php
     95                if ( ! class_exists( '\WordPressdotorg\Forums\Plugin' ) ) {
     96                        return;
     97                }
     98
     99                $project        = null;
     100                $plugin_instance = \WordPressdotorg\Forums\Plugin::get_instance();
     101
     102                if ( ! empty( $plugin_instance->plugins->plugin ) ) {
     103                        $project          = $plugin_instance->plugins->plugin;
     104                        $project_type     = 'plugin';
     105                        $project_versions = $this->get_project_versions( $project_type, $project->post_name );
     106
     107                        $label = __( 'Plugin Version:', 'wporg-forums' );
     108                        /* translators: %s: plugin name */
     109                        $hint = _x( 'Select the version of %s you are using.', 'plugin', 'wporg-forums' );
     110                } elseif ( ! empty( $plugin_instance->themes->theme ) ) {
     111                        $project          = $plugin_instance->themes->theme;
     112                        $project_type     = 'theme';
     113                        $project_versions = $this->get_project_versions( $project_type, $project->post_name );
     114
     115                        $label = __( 'Theme Version:', 'wporg-forums' );
     116                        /* translators: %s: theme name */
     117                        $hint = _x( 'Select the version of %s you are using.', 'theme', 'wporg-forums' );
     118                }
     119
     120                if ( ! $project ) {
     121                        return;
     122                }
     123
     124                $project_version = 0;
     125                $project_other_version = '';
     126
     127                // Post value passed
     128                if ( bbp_is_topic_form_post_request() && isset( $_POST[ self::PROJECT_META_KEY ] ) ) {
     129                        $project_version = $this->sanitize_version( $_POST[ self::PROJECT_META_KEY ] );
     130
     131                // No post value passed
     132                } else if ( bbp_is_single_topic() || bbp_is_topic_edit() ) {
     133                        $project_version = $topic_versions['project_version'];
     134
     135                        if ( false === $project_version ) {
     136                                $project_version = 0;
     137                        }
     138                }
     139
     140                if ( ! empty( $project_version ) && ! array_key_exists( $project_version, $project_versions ) ) {
     141                        $project_other_version = $project_version;
     142                        $project_version = 'other';
     143                }
     144                ?>
     145                <p>
     146                        <label for="project-version"><?php echo esc_html( sprintf( $label, $project->post_title ) ); ?></label><br />
     147                        <em><?php echo esc_html( sprintf( $hint, $project->post_title ) ); ?></em><br />
     148
     149                        <select name="<?php echo esc_attr( self::PROJECT_META_KEY ); ?>" id="project-version">
     150                                <?php foreach ( $project_versions as $key => $label ) : ?>
     151                                        <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $project_version ); ?>><?php echo esc_html( $label ); ?></option>
     152                                <?php endforeach; ?>
     153                        </select>
     154
     155                        <label for="project-other-version"><?php esc_html_e( 'Enter a different version here:', 'wporg-forums' ); ?></label>
     156                        <input type="text" name="project_other_version" id="project-other-version" value="<?php echo esc_attr( $project_other_version ); ?>">
     157
     158                        <input type="hidden" name="project_type" value="<?php echo esc_attr( $project_type ); ?>" />
     159                        <input type="hidden" name="project_slug" value="<?php echo esc_attr( $project->post_name ); ?>" />
     160                </p>
     161                <?php
    92162        }
    93163
     164        /**
     165         * Process topic form submission.
     166         *
     167         * @param int $topic_id Topic ID.
     168         */
    94169        public function topic_post_extras( $topic_id ) {
    95                 $version = false;
    96                 $versions = $this->get_wp_versions();
    97                 if ( ( $_POST[ self::META_KEY ] ) && in_array( $_POST[ self::META_KEY ], $versions ) ) {
    98                         $version = $this->sanitize_wp_version( $_POST[ self::META_KEY ] );
     170                $wp_version  = false;
     171                $wp_versions = $this->get_wp_versions();
     172
     173                if ( ( $_POST[ self::META_KEY ] ) && in_array( $_POST[ self::META_KEY ], $wp_versions ) ) {
     174                        $wp_version = $this->sanitize_version( $_POST[ self::META_KEY ] );
    99175                } else if ( isset( $_POST['wp_other_version'] ) ) {
    100                         $version = $this->sanitize_wp_version( $_POST['wp_other_version'] );
     176                        $wp_version = $this->sanitize_version( $_POST['wp_other_version'] );
    101177                }
    102178
    103                 if ( false !== $version ) {
     179                $project_version = false;
     180
     181                if ( isset( $_POST['project_type'] ) && isset( $_POST['project_slug'] ) ) {
     182                        $project_type = sanitize_title_for_query( $_POST['project_type'] );
     183                        $project_slug = sanitize_title_for_query( $_POST['project_slug'] );
     184
     185                        $project_versions = $this->get_project_versions( $project_type, $project_slug );
     186
     187                        if ( ( $_POST[ self::PROJECT_META_KEY ] ) && in_array( $_POST[ self::PROJECT_META_KEY ], $project_versions ) ) {
     188                                $project_version = $this->sanitize_version( $_POST[ self::PROJECT_META_KEY ] );
     189                        } else if ( isset( $_POST['project_other_version'] ) ) {
     190                                $project_version = $this->sanitize_version( $_POST['project_other_version'] );
     191                        }
     192                }
     193
     194                if ( false !== $wp_version || false !== $project_version ) {
    104195                        $this->set_topic_version( array(
    105                                 'id' => $topic_id,
    106                                 'version' => $version
     196                                'id'              => $topic_id,
     197                                'wp_version'      => $wp_version,
     198                                'project_version' => $project_version,
    107199                        ) );
    108200                }
    109201        }
    110202
     203        /**
     204         * Enqueue plugin scripts.
     205         */
    111206        public function enqueue_scripts() {
    112207                if (
    113208                        bbp_is_single_forum() || bbp_is_single_topic() || bbp_is_topic_edit()
     
    118213                }
    119214        }
    120215
     216        /**
     217         * Get version data for a particular topic.
     218         *
     219         * @param array $args Array of arguments. Accepts 'id'.
     220         * @return array {
     221         *     Topic versions.
     222         *
     223         *     @type string $wp_version      WordPress version.
     224         *     @type string $project_version Plugin or theme version.
     225         * }
     226         */
    121227        public static function get_topic_version( $args = array() ) {
    122228
    123229                // Parse arguments against default values
     
    131237                        return;
    132238                }
    133239
    134                 $retval = get_post_meta( $topic->ID, self::META_KEY, true );
     240                $wp_version      = get_post_meta( $topic->ID, self::META_KEY, true );
     241                $project_version = get_post_meta( $topic->ID, self::PROJECT_META_KEY, true );
     242
     243                $retval = compact( 'wp_version', 'project_version' );
     244
    135245                return apply_filters( 'get_topic_version', $retval, $r, $args );
    136246        }
    137247
     248        /**
     249         * Set version data for a particular topic.
     250         *
     251         * @param array {
     252         *     Array of arguments.
     253         *
     254         *     @type int    $id              Topic ID.
     255         *     @type string $wp_version      WordPress version.
     256         *     @type string $project_version Plugin or theme version.
     257         * }
     258         */
    138259        public function set_topic_version( $args = array() ) {
    139260
    140261                // Parse arguments against default values
    141262                $r = bbp_parse_args( $args, array(
    142                         'id'      => 0,
    143                         'version' => '',
     263                        'id'              => 0,
     264                        'wp_version'      => '',
     265                        'project_version' => '',
    144266                ), 'set_topic_version' );
    145267
    146268                $topic = bbp_get_topic( $r['id'] );
     
    149271                        return;
    150272                }
    151273
    152                 if ( empty( $r['version'] ) ) {
    153                         delete_post_meta( $r['id'], self::META_KEY );
    154                 } else {
    155                         update_post_meta( $r['id'], self::META_KEY, $r['version'] );
     274                if ( false !== $r['wp_version'] ) {
     275                        if ( empty( $r['wp_version'] ) ) {
     276                                delete_post_meta( $r['id'], self::META_KEY );
     277                        } else {
     278                                update_post_meta( $r['id'], self::META_KEY, $r['wp_version'] );
     279                        }
    156280                }
     281
     282                if ( false !== $r['project_version'] ) {
     283                        if ( empty( $r['project_version'] ) ) {
     284                                delete_post_meta( $r['id'], self::PROJECT_META_KEY );
     285                        } else {
     286                                update_post_meta( $r['id'], self::PROJECT_META_KEY, $r['project_version'] );
     287                        }
     288                }
    157289        }
    158290
     291        /**
     292         * Get the list of WordPress core versions.
     293         *
     294         * @return array Array of WordPress versions.
     295         */
    159296        public function get_wp_versions() {
    160297                $versions = array_merge(
    161298                        array( '0' => '' ),
    162299                        apply_filters( 'wporg_bbp_get_wp_versions', array() ),
    163                         /* translators: WordPress Version */
     300                        /* translators: WordPress version */
    164301                        array( 'other' => __( 'Other:', 'wporg-forums' ) )
    165302                );
    166303                return $versions;
    167304        }
    168305
    169         public function sanitize_wp_version( $version ) {
     306        /**
     307         * Get the list of plugin or theme versions from the directory.
     308         *
     309         * @param string $type Project type. Accepts 'plugin' or 'theme'.
     310         * @param string $slug Project slug.
     311         * @return array Array of project versions, keyed by version.
     312         */
     313        public function get_project_versions( $type, $slug ) {
     314                // Check the cache.
     315                $cache_key   = $slug;
     316                $cache_group = $type . '-versions';
     317                $versions    = wp_cache_get( $cache_key, $cache_group );
     318
     319                if ( false !== $versions ) {
     320                        return $versions;
     321                }
     322
     323                $versions = array();
     324
     325                if ( 'plugin' === $type && get_site( WPORG_PLUGIN_DIRECTORY_BLOGID ) ) {
     326
     327                        switch_to_blog( WPORG_PLUGIN_DIRECTORY_BLOGID );
     328
     329                        $projects = get_posts( array(
     330                                'name'           => $slug,
     331                                'post_type'      => 'plugin',
     332                                'post_status'    => array( 'publish', 'pending', 'disabled', 'closed', 'draft', 'approved' ),
     333                                'posts_per_page' => 1,
     334                        ) );
     335
     336                        if ( $projects ) {
     337                                $project  = reset( $projects );
     338                                $versions = get_post_meta( $project->ID, 'tagged_versions', true );
     339                                $versions = array_combine( $versions, $versions );
     340                        }
     341
     342                        restore_current_blog();
     343
     344                } elseif ( 'theme' === $type && get_site( WPORG_THEME_DIRECTORY_BLOGID ) ) {
     345
     346                        switch_to_blog( WPORG_THEME_DIRECTORY_BLOGID );
     347
     348                        $projects = get_posts( array(
     349                                'name'           => $slug,
     350                                'post_type'      => 'repopackage',
     351                                'post_status'    => array( 'publish', 'pending', 'draft', 'future', 'trash', 'suspend' ),
     352                                'posts_per_page' => 1,
     353                        ) );
     354
     355                        if ( $projects ) {
     356                                $project       = reset( $projects );
     357                                $versions_meta = get_post_meta( $project->ID, '_status', true );
     358
     359                                if ( $versions_meta ) {
     360                                        $versions = array_keys( $versions_meta );
     361                                        $versions = array_combine( $versions, $versions );
     362                                }
     363                        }
     364
     365                        restore_current_blog();
     366
     367                }
     368
     369                $versions = array_merge(
     370                        array( '0' => '' ),
     371                        apply_filters( 'wporg_bbp_get_project_versions', $versions, $type, $slug ),
     372                        /* translators: plugin or theme version */
     373                        array( 'other' => __( 'Other:', 'wporg-forums' ) )
     374                );
     375
     376                wp_cache_set( $cache_key, $versions, $cache_group, DAY_IN_SECONDS );
     377
     378                return $versions;
     379        }
     380
     381        /**
     382         * Sanitize version value.
     383         *
     384         * @param string $version Version value.
     385         * @return string Sanitized value.
     386         */
     387        public function sanitize_version( $version ) {
    170388                return preg_replace( '#[^0-9a-z.-]#i', '', $version );
    171389        }
    172390}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-bbp-version-dropdown/wporg-bbp-version-dropdown.js

     
    33
    44        var Plugin = {
    55                initialize: function () {
    6                         var $otherVersion = $( '#wp-other-version' );
    7                         var $label = $( 'label[for=wp-other-version]' );
     6                        var $otherVersion = $( 'input[id$="-other-version"]' );
     7                        var $label = $( 'label[for$="-other-version"]' );
    88
    99                        if ( ! $otherVersion.length ) {
    1010                                return;
     
    1616                        $otherVersion.hide();
    1717                        $label.hide();
    1818
    19                         var $wpVersion = $( '#wp-version' );
     19                        var $wpVersion = $( 'select[id$="-version"]' );
    2020                        if ( ! $wpVersion.length ) {
    2121                                return;
    2222                        }
     
    2727                },
    2828
    2929                updateOtherVersion: function () {
    30                         if ( 'other' == $( this ).val() ) {
    31                                 Plugin.$label.show();
    32                                 Plugin.$otherVersion.show().focus();
    33                         } else {
    34                                 Plugin.$label.hide();
    35                                 Plugin.$otherVersion.hide();
    36                         }
     30                        $( this ).each( function () {
     31                                var index = ( 'wp-version' === $( this ).attr( 'id' ) ) ? 0 : 1;
     32
     33                                if ( 'other' == $( this ).val() ) {
     34                                        Plugin.$label.eq( index ).show();
     35                                        Plugin.$otherVersion.eq( index ).show().focus();
     36                                } else {
     37                                        Plugin.$label.eq( index ).hide();
     38                                        Plugin.$otherVersion.eq( index ).hide();
     39                                }
     40                        });
    3741                }
    3842        };
    3943
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-support/functions.php

     
    548548        $voice_count = sprintf( _n( '%s participant', '%s participants', $voice_count, 'wporg-forums' ), bbp_number_format( $voice_count ) );
    549549        $last_reply  = bbp_get_topic_last_active_id( $topic_id );
    550550
    551         // WP version
    552         $wp_version = '';
     551        // WP and plugin/theme versions
     552        $wp_version = $project_version = $project_type = '';
     553
    553554        if ( function_exists( 'WordPressdotorg\Forums\Version_Dropdown\get_topic_version' ) ) {
    554                 $wp_version = WordPressdotorg\Forums\Version_Dropdown\get_topic_version( $topic_id );
     555                $topic_versions  = WordPressdotorg\Forums\Version_Dropdown\get_topic_version( $topic_id );
     556                $wp_version      = $topic_versions['wp_version'];
     557                $project_version = $topic_versions['project_version'];
    555558        }
    556559
     560        if ( class_exists( 'WordPressdotorg\Forums\Plugin' ) ) {
     561                $plugin_instance = WordPressdotorg\Forums\Plugin::get_instance();
     562
     563                if ( ! empty( $plugin_instance->plugins->plugin ) ) {
     564                        $project_type = 'plugin';
     565                } elseif ( ! empty( $plugin_instance->themes->theme ) ) {
     566                        $project_type = 'theme';
     567                }
     568        }
     569
    557570        ?>
    558571
    559572        <li class="topic-forum"><?php
     
    588601        <?php if ( ! empty( $wp_version ) ) : ?>
    589602                <li class="wp-version"><?php echo esc_html( $wp_version ); ?></li>
    590603        <?php endif; ?>
     604        <?php if ( ! empty( $project_type ) && ! empty( $project_version ) ) : ?>
     605                <li class="<?php echo esc_attr( $project_type ); ?>-version"><?php echo esc_html( $project_version ); ?></li>
     606        <?php endif; ?>
    591607        <?php if ( function_exists( 'WordPressdotorg\Forums\Topic_Resolution\get_topic_resolution_form' ) ) : ?>
    592608                <?php if ( WordPressdotorg\Forums\Topic_Resolution\Plugin::get_instance()->is_enabled_on_forum() && ( bbp_is_single_topic() || bbp_is_topic_edit() ) ) : ?>
    593609                        <li class="topic-resolved"><?php WordPressdotorg\Forums\Topic_Resolution\get_topic_resolution_form( $topic_id ); ?></li>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-support/sass/style-original.scss

     
    228228        content: "\f120";
    229229}
    230230
     231.sidebar .topic-info li.plugin-version:before {
     232        content: "\f106";
     233}
     234
     235.sidebar .topic-info li.theme-version:before {
     236        content: "\f100";
     237}
     238
    231239.sidebar .topic-info li.topic-resolved:before {
    232240        content: "\f546";
    233241}
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-support/style-rtl.css

     
    420420        content: "\f120";
    421421}
    422422
     423.sidebar .topic-info li.plugin-version:before {
     424        content: "\f106";
     425}
     426
     427.sidebar .topic-info li.theme-version:before {
     428        content: "\f100";
     429}
     430
    423431.sidebar .topic-info li.topic-resolved:before {
    424432        content: "\f546";
    425433}
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-support/style.css

     
    420420        content: "\f120";
    421421}
    422422
     423.sidebar .topic-info li.plugin-version:before {
     424        content: "\f106";
     425}
     426
     427.sidebar .topic-info li.theme-version:before {
     428        content: "\f100";
     429}
     430
    423431.sidebar .topic-info li.topic-resolved:before {
    424432        content: "\f546";
    425433}