Zip Descargar ZIP Cambia el nombre de la carpeta del tema de WordPress

6 minutos de lectura

Zip Descargar ZIP Cambia el nombre de la carpeta del
hombre naranja555

He estado tratando de resolver esto, pero parece que no puedo encontrar nada al respecto.

Cuando “Descargas ZIP” de github, no te da el “nombre_tema.zip“que esperarías, sino más bien”tema_nombre-maestro.zip“, que cuando los usuarios promedio instalan esto, el nombre de la carpeta en mal estado arroja temas secundarios.

¿Cómo se puede remediar esto, para que la descarga del zip no cambie nada?

Zip Descargar ZIP Cambia el nombre de la carpeta del
lorenzo cherone

Para simplificar, puede alojar un script en algún lugar que descargue el script, cambie el nombre de la carpeta sin la -master y luego vuelva a comprimir el proyecto, luego envíelo al usuario como una descarga.

Entonces algo como (Requiere PHP5 >= 5.2.0, rizo, Archivo zipmodo_seguro y open_basedir apagado):

Fork desde GitHub ;p

<?php
//Example Usage
new GitDL('https://github.com/lcherone/GitDL');

/**
 * GitHub Project/Repository Downloader proxy.
 * This class will handle downloading, removing master folder prefix, 
 * repacking and proxying back the project as a download.
 * 
 * @author Lawrence Cherone
 * @version 0.2
 */
class GitDL{
    // project files working directory - automatically created
    const PWD = "./project_files/";

    /**
     * Class construct.
     *
     * @param string $url
     */
    function __construct($url=null){
        // check construct argument
        if(!$url) die('Class Error: Missing construct argument: $url');

        // fix trailing slash if any
        $url = rtrim($url, "https://stackoverflow.com/");

        // assign class properties
        $this->project     = basename($url);
        $this->project_url = $url.'/archive/master.zip';
        $this->tmp_file    = md5($url).'.zip';

        // make project working folder
        if(!file_exists(self::PWD)){
            mkdir(self::PWD.md5($url), 0775, true);
        }

        // get project zip from GitHub
        try{
            $this->get_project();
        }catch(Exception $e){
            die($e->getMessage());
        }

        // extract project zip from git
        $this->extract(self::PWD.$this->tmp_file, self::PWD.md5($url));

        // remove the master part, by renaming
        rename(self::PWD.md5($url)."https://stackoverflow.com/".$this->project.'-master', self::PWD.md5($url)."https://stackoverflow.com/".$this->project);

        // rezip project files
        $this->zipcreate(self::PWD.md5($url), self::PWD.'new_'.$this->tmp_file);

        // send zip to user
        header('Content-Description: File Transfer');
        header('Content-Type: application/zip');
        header('Content-Disposition: attachment; filename="'.$this->project.'.zip"');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: '.sprintf("%u", filesize(self::PWD.'new_'.$this->tmp_file)));
        readfile(self::PWD.'new_'.$this->tmp_file);

        // cleanup
        $this->destroy_dir(self::PWD.md5($url));
        unlink(self::PWD.$this->tmp_file);
        unlink(self::PWD.'new_'.$this->tmp_file);
    }

    /**
     * cURL GitHub project downloader. 
     * No support for open base dir/safe mode as there is a GitHub redirect to there CDN
     * a HEAD pre-check is done to check project exists,
     * project zip is written directly to the file.
     */
    function get_project(){
        // check curl installed
        if(!function_exists('curl_init')){
            throw new Exception('cURL Error: You must have cURL installed to use this class.');
        }
        // check for unsupported settings
        if (ini_get('open_basedir') != '' || ini_get('safe_mode') == 'On'){
            throw new Exception('cURL Error: safe_mode or an open_basedir is enabled, class not supported.');
        }

        // HEAD request - To verify the project exists
        $ch = curl_init();
        curl_setopt_array($ch, array(
            CURLOPT_URL => $this->project_url,
            CURLOPT_TIMEOUT => 5,
            CURLOPT_CONNECTTIMEOUT => 5,
            CURLOPT_FAILONERROR => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_BINARYTRANSFER => true,
            CURLOPT_HEADER => false,
            CURLOPT_NOBODY => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_SSL_VERIFYPEER => false,
        ));

        // lets grab it
        if(curl_exec($ch) !== false){
            $fp = fopen(self::PWD.$this->tmp_file, 'a+b');
            if(flock($fp, LOCK_EX | LOCK_NB)){
                // empty possible contents
                ftruncate($fp, 0);
                rewind($fp);

                // HTTP GET request - write directly to the file
                $ch = curl_init();
                curl_setopt_array($ch, array(
                    CURLOPT_URL => $this->project_url,
                    CURLOPT_TIMEOUT => 5,
                    CURLOPT_CONNECTTIMEOUT => 5,
                    CURLOPT_FAILONERROR => true,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_BINARYTRANSFER => true,
                    CURLOPT_HEADER => false,
                    CURLOPT_FILE => $fp,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_SSL_VERIFYHOST => false,
                    CURLOPT_SSL_VERIFYPEER => false,
                ));

                // transfer failed
                if(curl_exec($ch) === false){
                    ftruncate($fp, 0);
                    throw new Exception('cURL Error: transfer failed.');
                }
                fflush($fp);
                flock($fp, LOCK_UN);
                curl_close($ch);
            }
            fclose($fp);
        }else{
            curl_close($ch);
            throw new Exception('Error: '.htmlentities($this->project).' project not found on GitHub');
        }
    }

    /**
     * Create zip from extracted/fixed project.
     *
     * @uses ZipArchive
     * @uses RecursiveIteratorIterator
     * @param string $source
     * @param string $destination
     * @return bool
     */
    function zipcreate($source, $destination) {
        if (!extension_loaded('zip') || !file_exists($source)) {
            return false;
        }
        $zip = new ZipArchive();
        if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
            return false;
        }
        $source = str_replace('\\', "https://stackoverflow.com/", realpath($source));
        if (is_dir($source) === true) {
            $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
            foreach ($files as $file) {
                $file = str_replace('\\', "https://stackoverflow.com/", realpath($file));
                if (is_dir($file) === true) {
                    $zip->addEmptyDir(str_replace($source."https://stackoverflow.com/", '', $file."https://stackoverflow.com/"));
                } else if (is_file($file) === true) {
                    $zip->addFromString(str_replace($source."https://stackoverflow.com/", '', $file), file_get_contents($file));
                }
            }
        }
        return $zip->close();
    }

    /**
     * Extract Zip file
     *
     * @uses ZipArchive
     * @param string $source
     * @param string $destination
     * @return bool
     */
    function extract($source, $destination){
        $zip = new ZipArchive;
        if($zip->open($source) === TRUE) {
            $zip->extractTo($destination);
            $zip->close();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Recursive directory remover/deleter
     *
     * @uses RecursiveIteratorIterator
     * @param string $dir
     * @return bool
     */
    function destroy_dir($dir) {
        foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
            $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
        }
        return rmdir($dir);
    }

}
?>

  • ¡Me gusta! La próxima vez que me ocupe de esto, intentaré inyectar este script en el proceso de instalación/actualización de WP. ¡Cosas profesionales, gracias!

    – brasofilo

    21 de noviembre de 2013 a las 17:22

Eso es un poco problemático y no creo que haya una solución real, solo soluciones alternativas. Enfrenté el mismo problema con los complementos y solo tengo una solución parcial: funciona solo en actualizaciones de complementos/temas, no al instalar.

Nunca lo intenté, pero tal vez sea posible realizar el cambio de nombre de la carpeta en el complemento (register_activation_hook) o tema (after_switch_theme) activación.

Revisé el núcleo y el filtro. upgrader_source_selection funciona para temas y complementos. El slug del repositorio está en la URL de GitHub: http://github.com/user/repo-name.

public static $repo_slug = 'repo-name';

add_filter( 'upgrader_source_selection', array( $this, 'rename_github_zip' ), 1, 3 );

/**
 * Removes the prefix "-master" when updating from GitHub zip files
 * 
 * See: https://github.com/YahnisElsts/plugin-update-checker/issues/1
 * 
 * @param string $source
 * @param string $remote_source
 * @param object $thiz
 * @return string
 */
public function rename_github_zip( $source, $remote_source, $thiz )
{
    if(  strpos( $source, self::$repo_slug ) === false )
        return $source;

    $path_parts = pathinfo($source);
    $newsource = trailingslashit($path_parts['dirname']). trailingslashit( self::$repo_slug );
    rename($source, $newsource);
    return $newsource;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad