WordPress.org

Making WordPress.org


Ignore:
Timestamp:
08/07/2017 06:02:51 PM (4 years ago)
Author:
coffee2code
Message:

Browse Happy: Pull current browser version number data from Wikidata API rather than parsing Wikimedia markup.

Props Viper007Bond.
See https://github.com/WordPress/browsehappy/pull/39.
Fixes #2853.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/browsehappy.com/public_html/functions.php

    r2589 r5758  
    1111            'long_name' => 'Google Chrome',
    1212            'wikipedia' => 'Google_Chrome',
     13            'wikidata' => 'Q777',
    1314            'normalized' => 1, // just first number
    1415            'facebook' => 'googlechrome',
     
    2021            'long_name' => 'Mozilla Firefox',
    2122            'wikipedia' => 'Firefox',
     23            'wikidata' => 'Q698',
    2224            'normalized' => 1.5, // include second number if non-zero
    2325            'facebook' => 'Firefox',
     
    2931            'long_name' => 'Apple Safari',
    3032            'wikipedia' => 'Safari',
     33            'wikidata' => 'Q35773',
    3134            'normalized' => 1.5, // include second number if non-zero
    3235            'facebook' => false,
     
    3841            'long_name' => 'Opera',
    3942            'wikipedia' => 'Opera',
     43            'wikidata' => 'Q41242',
    4044            'normalized' => 1, // just first number
    4145            'facebook' => 'Opera',
     
    4751            'long_name' => 'Microsoft Edge',
    4852            'wikipedia' => 'Microsoft_Edge',
     53            'wikidata' => 'Q18698690',
    4954            'normalized' => 1, // just first number
    5055            'facebook' => 'MicrosoftEdge',
     
    5661            'long_name' => 'Microsoft Internet Explorer',
    5762            'wikipedia' => 'Internet_Explorer',
     63            'wikidata' => 'Q1575',
    5864            'normalized' => 1, // just first number
    5965            'facebook' => 'internetexplorer',
     
    8086function browsehappy_fetch_version( $browser, $normalize = true ) {
    8187
    82     $fragment = browsehappy_get_browser_data( $browser )->wikipedia;
    83     if ( ! $fragment )
    84         return false;
     88    $fragment = browsehappy_get_browser_data( $browser )->wikidata;
     89    if ( ! $fragment ) {
     90        return false;
     91    }
    8592
    8693    // Unexpiring transients are autoloaded. We expire these manually on cron instead.
    8794    $stored_version = get_transient( 'browsehappy_version_' . $browser );
    8895    if ( false !== $stored_version ) {
    89         if ( $normalize )
     96        if ( $normalize ) {
    9097            return browsehappy_normalize_version( $browser, $stored_version );
     98        }
    9199        return $stored_version;
    92100    }
    93101
    94     $url = 'https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=php&titles=Template:Latest_stable_software_release/';
    95     $url .= $fragment;
    96 
    97     $response = wp_remote_get( $url );
    98 
    99     if ( is_wp_error( $response ) )
    100         return false;
    101 
    102     if ( ! $content = wp_remote_retrieve_body( $response ) )
    103         return false;
    104 
    105     if ( ! is_serialized( $content ) )
    106         return false;
    107 
    108     $content = maybe_unserialize( $content );
    109     $page = array_pop( $content['query']['pages'] );
    110     $raw_data = explode( "\n", $page['revisions'][0]['*'] );
    111 
    112     $version = false;
    113     foreach( $raw_data as $data ) {
    114         $data = trim( $data, '| ' );
    115         if ( false !== strpos( $data, 'Android' ) || false !== strpos( $data, 'iOS' ) )
    116             continue;
    117         if ( false !== strpos( $data, 'Linux' ) && false === strpos( $data, 'Mac OS X' ) && false === strpos( $data, 'Windows' ) && false === strpos( $data, 'Microsoft' ) )
    118             continue;
    119         if ( ( false !== $pos = strpos( $data, 'latest_release_version' ) ) || ( false !== $pos = strpos( $data, 'latest release version' ) ) ) {
    120             if ( $pos )
    121                 $data = substr( $data, $pos );
    122             $version = trim( str_replace( array( 'latest_release_version', 'latest release version', '=' ), '', $data ), '| ' ) . " ";
    123             $version = str_replace( "'''Mac OS X''' and '''Microsoft Windows'''<br />", '', $version );
    124             $version = str_replace( "'''Windows 10'''<br>", '', $version );
    125             $version = substr( $version, 0, strpos( $version, ' ' ) );
    126             break;
     102    // See https://github.com/WordPress/browsehappy/issues/37
     103    $query = "
     104        SELECT ?version WHERE {
     105            wd:{$fragment} p:P348 [
     106                ps:P348 ?version;
     107                pq:P548 wd:Q12355314;
     108                wikibase:rank wikibase:PreferredRank
     109            ].
    127110        }
    128     }
    129 
    130     if ( false === $version )
    131         return false;
     111        LIMIT 1
     112    ";
     113
     114    $request = wp_remote_get( add_query_arg(
     115        array(
     116            'format' => 'json',
     117            'query'  => rawurlencode( $query ),
     118        ),
     119        'https://query.wikidata.org/bigdata/namespace/wdq/sparql'
     120    ) );
     121
     122    if ( is_wp_error( $request ) ) {
     123        return false;
     124    }
     125
     126    $data = json_decode( wp_remote_retrieve_body( $request ) );
     127
     128    if (
     129        empty( $data ) ||
     130        empty( $data->results ) ||
     131        ! is_array( $data->results->bindings ) ||
     132        empty( $data->results->bindings[0] ) ||
     133        empty( $data->results->bindings[0]->version ) ||
     134        empty( $data->results->bindings[0]->version->value )
     135    ) {
     136        return false;
     137    }
     138
     139    $version = $data->results->bindings[0]->version->value;
    132140
    133141    $version = preg_replace( '/[^0-9\.]/', '', $version );
     
    135143    set_transient( 'browsehappy_version_' . $browser, $version );
    136144
    137     if ( $normalize )
     145    if ( $normalize ) {
    138146        return browsehappy_normalize_version( $browser, $version );
     147    }
    139148
    140149    return $version;
Note: See TracChangeset for help on using the changeset viewer.