WordPress.org

Make WordPress Core

Changeset 8367


Ignore:
Timestamp:
07/17/2008 10:51:26 PM (10 years ago)
Author:
ryan
Message:

Plugin metadata localization and get_plugin_dta() optimization from santosj. fixes #5651 #3089

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/plugin.php

    r8266 r8367  
    11<?php
    2 
     2/**
     3 * WordPress Plugin Administration API
     4 *
     5 * @package WordPress
     6 * @subpackage Administration
     7 */
     8
     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.7.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.7.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 );
     
    13123    else
    14124        $version = '';
     125
     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    }
    15145
    16146    $description = wptexturize( trim( $description[1] ));
Note: See TracChangeset for help on using the changeset viewer.