【问题标题】:WordPress: Hook for when a theme update was installedWordPress:安装主题更新时挂钩
【发布时间】:2017-06-23 02:46:18
【问题描述】:

当用户更新主题设置时,我的主题会创建一个 css 文件。这没有问题。

现在,当从仪表板中更新主题或发生自动更新时,我还需要创建 css 文件。

我根据以下示例研究了upgrader_process_completeupgrader_post_installhttps://codex.wordpress.org/Plugin_API/Action_Reference/upgrader_process_completehttps://wordpress.stackexchange.com/questions/215063/limit-filter-upgrader-post-install-to-a-single-plugin,但由于某种原因,我更新主题后没有触发我的函数。

以下代码在我的主题的functions.php中。

function create_css_file() {
   //code to create css file
}

function my_upgrade_function( $options ) {
    create_css_file();
}
add_action( 'upgrader_process_complete', my_upgrade_function, 10, 2);

//I also tried this. No luck
add_filter( 'upgrader_post_install', my_upgrade_function, 100, 0 );

我错过了一些基本的东西吗?

更新 #1: 我使用add_action( 'upgrader_process_complete', my_upgrade_function, 150); 降低了优先级 现在似乎可以工作了,但是当调用create_css_file 函数时,它使用的是以前的版本,而不是新安装的版本。当我检查创建的 CSS 文件时,它是新生成的,但基于旧版本。不知道为什么会这样。

我也将其更改为 add_action( 'upgrader_process_complete', my_upgrade_function, 1); - 同样的问题。正在使用旧代码,而不是新安装的代码。

更新 #2: 好的,我得出的结论是,upgrader_process_completeupgrader_post_install 在仍然安装旧主题的同时被解雇,这与整个目的背道而驰。

我迅速进行了测试,删除了整个 upgrader_process_complete 部分,并将其上传到我的私人存储库。然后我转到主题并在仪表板中更新它,但upgrader_process_complete 仍然被触发,再次根据已安装的主题创建一个 css 文件,而不是新安装的主题。但正如我所说,我实际上删除了整个 upgrader_process_complete 代码部分,所以它不应该一开始就被解雇。

这让我相信,upgrader_process_complete 在仍然安装旧主题的同时被触发。

这让我回到了第一方。主题更新成功安装后如何调用函数?

【问题讨论】:

  • 你说的很对,这些函数版本总是调用,从不 >新的一个。一个善良的灵魂甚至更新了法典以包含该警告。四年过去了,你似乎还在为同样的问题而苦恼——我也希望找到解决办法!

标签: wordpress


【解决方案1】:

遇到类似问题,我决定将主题版本存储在一个选项中,并根据当前主题版本进行检查:

add_action('after_setup_theme', 'PREFIX_check_theme_version');
function PREFIX_check_theme_version() {

  $current_version = wp_get_theme()->get('Version');
  $old_version = get_option( 'PREFIX_theme_version' );

  if ($old_version !== $current_version) {
    // do some cool stuff
    create_css_file();

    // update not to run twice
    update_option('PREFIX_theme_version', $current_version);
  }
}

当然,您应该删除主题停用选项:

add_action('switch_theme', 'PREFIX_options_removal');

function PREFIX_options_removal () {
  delete_option('PREFIX_theme_version');
}

这很hacky,但可以完成工作

【讨论】:

  • Codex 似乎建议添加瞬态而不是选项,但本质上是相同的。恕我直言,它太丑了,不能认为是一个好的解决方案——对于本应简单的事情来说,这是一个肮脏的黑客攻击!
  • 另外,after_setup_theme 被调用每次加载页面时,这……太糟糕了(the Codex says as much 我的日志显示它是真的…… )
猜你喜欢
  • 2015-03-08
  • 2023-03-03
  • 1970-01-01
  • 2019-06-14
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多