自定义主题更新器-新主题名称中的随机字符串

时间:2017-04-05 作者:pallazzio

我正在制作一个可通过github更新的主题。https://github.com/pallazzio/skeleton

我试图使用smashing杂志的插件更新程序教程,改为更新主题。https://www.smashingmagazine.com/2015/08/deploy-wordpress-plugins-with-github-using-transients/

我几乎成功了。更新将下载并安装到正确的文件夹中。然而,它并没有让同一主题保持活动状态,而是激活了一个新主题,其名称是pallazzio-skeleton-b203a7f。

奇怪的是,没有使用该名称创建文件夹。将文件安装到正确的位置。一旦我将活动主题切换回原始主题名称,更新就可以完全正常运行。

我唯一需要完成的是如何确保当前活动主题不会更改为随机名称。我卡住了。

任何帮助都将不胜感激。

下面是函数中的相关部分。php

// Init theme updater
if( ! class_exists( \'Pallazzio_Theme_Updater\' ) ){
    include_once( \'updater.php\' );
}
$updater = new Pallazzio_Theme_Updater( \'skeleton\' );
$updater->set_username( \'pallazzio\' );
$updater->set_repository( \'skeleton\' );
//$updater->authorize( \'abcdefghijk1234567890\' ); // auth code for private repos
$updater->initialize();
以下是更新程序的内容。php

<?php
class Pallazzio_Theme_Updater {
    private $theme;
    private $username;
    private $repository;
    private $authorize_token;
    private $github_response;

    public function __construct( $theme ) {
        $this->theme = wp_get_theme( $theme );
        return $this;
    }

    public function set_username( $username ) {
        $this->username = $username;
    }

    public function set_repository( $repository ) {
        $this->repository = $repository;
    }

    public function authorize( $token ) {
        $this->authorize_token = $token;
    }

    public function initialize() {
        add_filter( \'pre_set_site_transient_update_themes\', array( $this, \'modify_transient\' ), 10, 1 );
        add_filter( \'upgrader_post_install\', array( $this, \'after_install\' ), 10, 3 );
    }

    public function modify_transient( $transient ) {
        if( property_exists( $transient, \'checked\') ) { // Check if transient has a checked property

            if( $checked = $transient->checked ) { // Did Wordpress check for updates?

                $this->get_repository_info(); // Get the repo info

                $out_of_date = version_compare( $this->github_response[\'tag_name\'], $checked[ $this->theme->template ], \'gt\' ); // Check if we\'re out of date

                if( $out_of_date ) {

                    $new_files = $this->github_response[\'zipball_url\']; // Get the ZIP

                    $theme = array( // setup our theme info
                        \'theme\' => $this->theme->template,
                        \'url\' => $this->theme->get( \'ThemeURI\' ),
                        \'package\' => $new_files,
                        \'new_version\' => $this->github_response[\'tag_name\']
                    );

                    $transient->response[$this->theme->template] = $theme; // Return it in response
                }
            }
        }

        return $transient; // Return filtered transient
    }

    public function after_install( $response, $hook_extra, $result ) {
        global $wp_filesystem; // Get global FS object

        $install_directory = get_template_directory(); // Our theme directory

        $result[\'destination_name\'] = $this->theme->template; // Set the destination name for the rest of the stack
        $result[\'remote_destination\'] = $install_directory; // Set the remote destination for the rest of the stack
        $wp_filesystem->move( $result[\'destination\'], $install_directory ); // Move files to the theme dir
        $result[\'destination\'] = $install_directory; // Set the destination for the rest of the stack

        //switch_theme( $this->theme->template );

        return $result;
    }

    private function get_repository_info() {
        if ( is_null( $this->github_response ) ) { // Do we have a response?
                $request_uri = sprintf( \'https://api.github.com/repos/%s/%s/releases\', $this->username, $this->repository ); // Build URI

                if( $this->authorize_token ) { // Is there an access token?
                        $request_uri = add_query_arg( \'access_token\', $this->authorize_token, $request_uri ); // Append it
                }

                $response = json_decode( wp_remote_retrieve_body( wp_remote_get( $request_uri ) ), true ); // Get JSON and parse it

                if( is_array( $response ) ) { // If it is an array
                        $response = current( $response ); // Get the first item
                }

                if( $this->authorize_token ) { // Is there an access token?
                        $response[\'zipball_url\'] = add_query_arg( \'access_token\', $this->authorize_token, $response[\'zipball_url\'] ); // Update our zip url with token
                }

                $this->github_response = $response;
        }
    }
}
?>

3 个回复
SO网友:Shivanand Sharma

主题名称与文件夹无关。主题名称来自样式内的标题信息。主题内的css文件。很可能下载的更新是另一个主题。这是因为更新系统本身存在漏洞。更新通过主题slug而不是主题名称进行检查。确保检查了正确的主题slug,并且服务器上的更新包具有正确的slug和主题名称。

SO网友:cjbj

整个过程太复杂了,我想不起来,但我可以给你一个建议。正如您所知,主题名称存储在two entries in the database. 看起来这些条目在某个地方被更改为临时名称,由实际名称、存储库名称和某种临时名称组成。问题是在哪里。

我的建议是通过回应来追踪这一点get_option(\'template\') 在您的代码中多次出现。这将帮助您找到切换发生的位置。我的猜测是:

$result[\'destination_name\'] = $this->theme->template;

SO网友:tomyam

确保所有主题文件都在一个目录中,而不是在ZIP文件的根目录中。

苹果在这里骗了我。看起来ZIP文件包含了主题文件夹,其中包含了所有主题文件,但事实并非如此。

将ZIP文件上载到服务器,解压缩以仔细检查它是否提取了主题文件夹,而不是根目录下的文件。

相关推荐

Wordpress Auto Updates

我需要在我的Wordpress上进行自动更新,这样我就可以跟踪抄本了here. 我需要的是从4.2.2到4.2.3和4.3等所有更新。。我的服务器上不需要FTP凭据。我的问题是我的WP没有更新。我做错什么了吗?我的Wordpress多久检查一次更新?这是我的wp-config.php, 我刚刚补充说define(\'WP_AUTO_UPDATE_CORE\', true); 到原始文件。define(\'DB_NAME\', \'xXyYzZtT\'); define(\'DB_USER\', \