如何定制保存功能事件?

时间:2019-10-07 作者:sfarzoso

我正在尝试自定义save 一个Wordpress主题的功能,不幸的是我没有这方面的必要知识,所以我需要一些帮助以正确的方式完成这项工作。

基本上,我购买的主题允许我创建property, 这个property 存储在post 表作为普通帖子,但当然包含主题分类法和其他选项。

当我创建或更新property, 我需要执行一个自定义函数,但我不知道该放在哪里。

property 是在中添加或更新的network 控制台调用此文件:

http://localhost/wordpress/wp-admin/admin-ajax.php?action=oembed-cache&post=24987
如何拦截$_POST 数据传递到该文件并发送到自定义函数?

我尝试了:

function fpw_post_info( $id, $post ) {
    var_dump("hello world");
}
add_action( \'publish_post\', \'fpw_post_info\', 10, 2 );
但我如何才能看到代码是否有效?

谨致问候。

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

发布/更新/保存帖子时,WordPress会触发许多不同的挂钩。通常,最好是浏览Codex,以确定在您想要运行自定义代码时,以及仅在您想要运行自定义代码时,哪个钩子才会触发。重要的是要知道,当你点击一个按钮时,其中一些钩子会多次触发。

在大多数情况下,您不能运行var_dump(), 因此,在每个钩子上添加一个测试函数通常很有帮助,在该测试函数中,fwrite到日志文件中,包括时间戳和钩子运行的位置。这样,您就可以看到事情的顺序以及每个钩子运行的次数,并开始缩小单个位置来运行自定义代码。

您可能想探索的一个钩子:save_post. 这个钩子允许您访问post ID,即完整的WP$post 对象,以及一个布尔值,用于判断这是否是正在更新的现有帖子。

所以,要测试save_post 胡克,你可以从

add_action(\'save_post\', \'wpse_see_save_post\', 20, 3);
function wpse_see_save_post($post_id, $post, $update) {
    // Open a log file and add to it ("a")
    $file = fopen(__DIR__.\'/save-post-hook.log\', \'a\');
    // Get the current timestamp
    $time = date("Y-m-d h:m");
    // Write timestamp and message to file
    fwrite($file, "$time - save_post ran");
    fclose($file);
}
您可能还想记录一些其他挂钩,例如transition_post_statuspost_updated - 甚至可能是同一个日志文件,这样您就可以看到事情的完整顺序以及可用的内容。

一旦知道事情发生的顺序,就可以开始访问数据。例如:

add_action(\'save_post\', \'wpse_see_save_post_data\', 20, 3);
function wpse_see_save_post_data($post_id, $post, $update) {
    // Open a log file and add to it ("a")
    $file = fopen(__DIR__.\'/save-post-data.log\', \'a\');
    // Get the current timestamp
    $time = date("Y-m-d h:m");
    // Write timestamp and message to file
    fwrite($file, "$time - save_post data includes\\r\\n");
    // access global $_POST array
    global $_POST;
    fwrite($file, print_r($_POST, true));
    fclose($file);
}
您可能会注意到,$\\u POST数据在一次运行时为空,但在另一次运行时填充。因此,您可以在函数中添加一个条件,如

if(count($_POST) > 0) {

只有当您知道自己有权访问所需的数据时,才能运行自定义代码。

SO网友:middlelady

一般来说,在WordPress环境中,您可以捕获$_POST 中的数据functions.php 您激活的主题。

然后,我经常会发现使用此函数可以快速而有用地调试数据并查看接收到的内容:

function write_log( $log )  {
  if ( is_array( $log ) || is_object( $log ) ) {
     error_log( print_r( $log, true ) );
  } else {
     error_log( $log );
  }
}
将其放入functions.php 您可以:

function fpw_post_info( $id, $post ) {
    write_log($_POST);
}
add_action( \'publish_post\', \'fpw_post_info\', 10, 2 );
此时,您可以在中看到传递的数据(以及任何其他类型的数据)debug.log 如果在WP中激活调试。阅读更多信息https://codex.wordpress.org/Debugging_in_WordPress

相关推荐