WordPress.org

Make WordPress Core

Ticket #5651: 3089.5651.patch.diff

File 3089.5651.patch.diff, 5.4 KB (added by darkdragon, 7 years ago)

Combined #3089 completed patch, along with #5651 optimizations, with phpdoc and based off of r6666

  • plugin.php

     
    11<?php 
     2/** 
     3 * WordPress Plugin Administration API 
     4 * 
     5 * @package WordPress 
     6 * @subpackage Administration 
     7 */ 
    28 
     9/** 
     10 * plugin_get_contents() - Retrieve enough of the plugin file to get plugin data. 
     11 * 
     12 * Some users have issues with opening large files and manipulating the 
     13 * contents for want is usually the first 1kiB or 2kiB. This function 
     14 * stops pulling in the plugin contents when it has all of the required 
     15 * plugin data. 
     16 * 
     17 * It also adds a little bit of padding for fudging the version info 
     18 * and to make sure that we grab absolutely everything, in case of a 
     19 * long description. 
     20 * 
     21 * The plugin file is assumed to have permissions to allow for scripts to 
     22 * read the file. This is not checked however and the file is only opened 
     23 * for reading. 
     24 * 
     25 * @link http://trac.wordpress.org/ticket/5651 Purpose of function. 
     26 * @since 2.5.0 
     27 * @uses plugin_has_required_fields() Checks for all of the required plugin 
     28 *              data fields. 
     29 * 
     30 * @param string $plugin_file Path to plugin file to open 
     31 * @return string Plugin file contents retrieved 
     32 */ 
     33function plugin_get_contents($plugin_file) { 
     34 
     35        // We don't need to write to the file, so just open for reading. 
     36        $fp = fopen($plugin_file, 'r'); 
     37 
     38        // Store the contents of the plugin file here. 
     39        $contents = ''; 
     40 
     41        // Keep reading the contents of the file until End of File is 
     42        // reached, or we grabbed all of the required plugin data. 
     43        while( !feof($fp) && !plugin_has_required_fields($contents) ) 
     44                $contents .= fread( $fp, 1024 ); 
     45 
     46        // Make sure that any padding is adding for long descriptions 
     47        // and grabbing any optional plugin data, not checked for. 
     48        if( !feof($fp) ) 
     49                $contents .= fread( $fp, 512 ); 
     50 
     51        // PHP will close file handle, but we are good citizens 
     52        fclose($fp); 
     53        return $contents; 
     54} 
     55 
     56/** 
     57 * plugin_has_required_fields() - Checks plugin contents for required plugin data 
     58 * 
     59 * @since 2.5.0 
     60 * @usedby plugin_get_contents() 
     61 * 
     62 * @param string $plugin_contents Plugin file contents 
     63 * @return bool Whether contents has all plugin data. 
     64 */ 
     65function plugin_has_required_fields($plugin_contents) { 
     66        $hasName = stripos($plugin_contents, 'plugin name:'); 
     67        $hasPluginURI = stripos($plugin_contents, 'plugin uri:'); 
     68        $hasDescription = stripos($plugin_contents, 'description:'); 
     69        $hasAuthor = stripos($plugin_contents, 'author:'); 
     70        $hasAuthorURI = stripos($plugin_contents, 'author uri:'); 
     71 
     72        if( false !== $hasName && false !== $hasPluginURI && false !== $hasDescription && 
     73                false !== $hasAuthor && false !== $hasAuthorURI) 
     74                return true; 
     75 
     76        return false; 
     77} 
     78 
     79/** 
     80 * get_plugin_data() - Parse the plugin contents to retrieve plugin's metadata 
     81 * 
     82 * The metadata of the plugin's data searches for the following in the plugin's 
     83 * header. 
     84 * 
     85 * <code> 
     86 * /* 
     87 * Plugin Name: Name of Plugin 
     88 * Plugin URI: Link to plugin information 
     89 * Description: Plugin Description 
     90 * Author: Plugin author's name 
     91 * Author URI: Link to the author's web site 
     92 * Version: Must be set in the plugin for WordPress 2.3+ 
     93 * Text Domain: Optional. Unique identifier, should be same as the one used in 
     94 *              plugin_text_domain() 
     95 * Domain Path: Optional. Only useful if the translations are located in a folder 
     96 *              above the plugin's base path. For example, if .mo files are located in 
     97 *              the locale folder then Domain Path will be "/locale/" and must have the 
     98 *              first slash. Defaults to the base folder the plugin is located in. 
     99 *  * / # Remove the space to close comment 
     100 * </code> 
     101 * 
     102 * Plugin data returned array contains the following: 
     103 *              'Name' - Name of the plugin, must be unique. 
     104 *              'Title' - Title of the plugin and the link to the plugin's web site. 
     105 *              'Description' - Description of what the plugin does and/or notes 
     106 *              from the author. 
     107 *              'Author' - The author's name and web site link. 
     108 *              'Version' - The plugin version number. 
     109 * 
     110 * @param string $plugin_file Path to the plugin file 
     111 * @return array See above for description. 
     112 */ 
    3113function get_plugin_data( $plugin_file ) { 
    4         $plugin_data = implode( '', file( $plugin_file )); 
     114        $plugin_data = plugin_get_contents( $plugin_file ); 
    5115        preg_match( '|Plugin Name:(.*)$|mi', $plugin_data, $plugin_name ); 
    6116        preg_match( '|Plugin URI:(.*)$|mi', $plugin_data, $plugin_uri ); 
    7117        preg_match( '|Description:(.*)$|mi', $plugin_data, $description ); 
     
    13123        else 
    14124                $version = ''; 
    15125 
     126        if( preg_match( '|Text Domain:(.*)$|mi', $plugin_data, $text_domain ) ) { 
     127                if( preg_match( '|Domain Path:(.*)$|mi', $plugin_data, $domain_path ) ) 
     128                        $domain_path = trim( $domain_path[1] ); 
     129 
     130                $text_domain = trim( $text_domain[1] ); 
     131 
     132                if( !empty( $text_domain ) ) { 
     133                        if( !empty( $domain_path ) ) 
     134                                load_plugin_textdomain($text_domain, dirname($plugin_file). $domain_path); 
     135                        else 
     136                                load_plugin_textdomain($text_domain, dirname($plugin_file)); 
     137                } 
     138 
     139                $description[1] = translate(trim($description[1]), $text_domain); 
     140                $plugin_name[1] = translate(trim($plugin_name[1]), $text_domain); 
     141                $plugin_uri[1] = translate(trim($plugin_uri[1]), $text_domain); 
     142                $author_name[1] = translate(trim($author_name[1]), $text_domain); 
     143                $author_uri[1] = translate(trim($author_uri[1]), $text_domain); 
     144        } 
     145 
    16146        $description = wptexturize( trim( $description[1] )); 
    17147 
    18148        $name = $plugin_name[1];