将元信息添加到主题本身

时间:2016-09-08 作者:Jonathan Weber

对于我当前的项目(自定义而非公开的WordPress主题),我想show additional information with the themes existing meta data (版本、作者、描述,“访问主题网站”等)。

更具体地说:主题可以保存一个部署键,将使用jQuery/AJAX对照我自己的小部署服务器检查其有效性。我想显示主题是否具有有效的部署密钥,以及该密钥是否符合支持和主题升级的条件。

不幸的是,似乎没有可以用来添加或修改元数据的操作或过滤器。有人能提供一些建议吗?

提前万分感谢!向你问好,乔纳森

2 个回复
最合适的回答,由SO网友:Jonathan Weber 整理而成

就我的研究而言,在写作的时候,没有办法在主题屏幕上连接到WordPress主题列表例程。这意味着,如果不修改核心文件或用您自己的实现替换主题屏幕,就很可能无法更改屏幕内容。两者都是不可接受的解决方案。

目前,我解决了以下问题:

部署服务器提供wordpress。js文件(有点像CDN)。此文件已加载wp_enqueue_script(..). 该文件使用主题slug、部署服务器、部署存储库和部署密钥进行本地化。基于主题slug,它对主题管理屏幕上的每个“主题”div运行AJAX-GET请求,请求部署键验证,并根据服务器响应为主题提供彩色边框

我计划进一步改进API,使主题更新程序类每隔几天需要进行一次服务器端许可证检查,这是由页面访问触发的。未能通过此检查将意味着前端阻塞。

SO网友:Dave Romsey

无法扩展所使用的默认标头WP_Theme:

private static $file_headers = array(
    \'Name\'        => \'Theme Name\',
    \'ThemeURI\'    => \'Theme URI\',
    \'Description\' => \'Description\',
    \'Author\'      => \'Author\',
    \'AuthorURI\'   => \'Author URI\',
    \'Version\'     => \'Version\',
    \'Template\'    => \'Template\',
    \'Status\'      => \'Status\',
    \'Tags\'        => \'Tags\',
    \'TextDomain\'  => \'Text Domain\',
    \'DomainPath\'  => \'Domain Path\',
);
Here\'s another post 有人试图做同样的事情。

我一直在挖,发现this post over-on-Stack溢出提供了一种解决方法,可以硬编码和读取自定义文件头。

我意识到您希望能够动态地读写这些标题,并根据信息显示消息,这个答案并没有涵盖所有这些,但这是一个良好的开端。

假设主题中有此标题:

/*
Theme Name: Dave\'s Good Stuff 80\'s Theme
Theme URI: https://www.youtube.com/playlist?list=PL3k1BzkuZjd7F0EE6mp5LPQWxigJ-8_td
Author: Dave Romsey
Author URI: http://daveromsey.com
Description: A cool theme.
Version: 0.1.0
Tags: 
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: goto10
Key: 867-5309
*/
此代码将能够提取自定义文件头密钥:

/**
 * Retrieve metadata from a file.
 *
 * Searches for metadata in the first 8kiB of a file, such as a plugin or theme.
 * Each piece of metadata must be on its own line. Fields can not span multiple
 * lines, the value will get cut at the end of the first line.
 *
 * If the file data is not within that first 8kiB, then the author should correct
 * their plugin file and move the data headers to the top.
 *
 * @param string $file Path to the file
 * @param array $default_headers List of headers, in the format array(\'HeaderKey\' => \'Header Name\')
 */

function wpse238644_get_file_data( $file, $default_headers) {
    $fp = fopen( $file, \'r\' );
    $file_data = fread( $fp, 8192 );
    fclose( $fp );
    $file_data = str_replace( "\\r", "\\n", $file_data );
    $all_headers = $default_headers;

    foreach ( $all_headers as $field => $regex ) {
            if (preg_match( \'/^[ \\t\\/*#@]*\' . preg_quote( $regex, \'/\' ) . \':(.*)$/mi\', $file_data, $match ) 
                    && $match[1])
                    $all_headers[ $field ] = trim(preg_replace("/\\s*(?:\\*\\/|\\?>).*/", \'\', $match[1]));
            else
                    $all_headers[ $field ] = \'\';
    }

    return $all_headers;
}


function wpse238644_get_theme_data() {
    // Customize these to fit your needs
    $file_headers = array(
        \'Name\'        => \'Theme Name\',
        \'ThemeURI\'    => \'Theme URI\',
        \'Description\' => \'Description\',
        \'Author\'      => \'Author\',
        \'AuthorURI\'   => \'Author URI\',
        \'Version\'     => \'Version\',
        \'Template\'    => \'Template\',
        \'Status\'      => \'Status\',
        \'Tags\'        => \'Tags\',
        \'TextDomain\'  => \'Text Domain\',
        \'DomainPath\'  => \'Domain Path\',
        \'Key\'         => \'Key\',
    );

    $theme_headers = wpse238644_get_file_data( get_template_directory() . \'/style.css\', $file_headers );

    $theme_key = isset( $theme_headers[\'Key\'] ) ? $theme_headers[\'Key\'] : false;

    // Do something with the key
    //var_dump( $theme_key );
}
add_action( \'init\', \'wpse238644_get_theme_data\' );

相关推荐