WordPress.org

Make WordPress Core

Ticket #5651: 3089.5651.patch.diff

File 3089.5651.patch.diff, 5.4 KB (added by darkdragon, 10 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];