自定义帖子类型动作挂钩/瞬态

Posted

技术标签:

【中文标题】自定义帖子类型动作挂钩/瞬态【英文标题】:Custom Post Type Action Hook / Transients 【发布时间】:2014-09-01 06:18:38 【问题描述】:

这个问题是关于我正在开发的插件。

每次添加或编辑名为“产品”的自定义帖子类型时,我都会尝试触发一个函数。特别是,我需要一个在添加/编辑页面上加载元框之前触发的钩子,但它只会在“产品”自定义帖子类型的编辑页面上触发。

将触发的函数发出 API 请求,并暂时缓存响应。

动作挂钩的原因是因为在我当前的代码中,当瞬态过期时,添加/编辑页面在第一页加载期间被破坏。但是,如果您在此之后刷新页面,它会按预期显示。我相当肯定这正在发生,因为检查瞬态的当前条件语句位于生成元框的函数内部。所以我的理论是,如果我可以在生成元框之前设置一个动作挂钩来检查瞬态,它可能会解决问题。

但是我有第二个理论,即问题是由于发出 API 请求并返回响应所需的时间比加载页面所需的时间长。因此,如果有一个动作钩子会延迟页面加载直到函数完成执行,那将是一个理想的解决方案,但我不相信这样的动作钩子存在。我什至不确定这样的延迟是否可能。

非常感谢你们可能提供的任何帮助或替代建议。谢谢你们的时间。

代码示例:

add_action( 'edit_product', 'llc_hook_campaign_find_active' );
function llc_hook_campaign_find_active() 
    if (!$t_campaign_find_active)
        limelight_cart_campaign_find_active();
        return false;
    

【问题讨论】:

【参考方案1】:

通过使用操作过滤器 edit_form_top,我能够在元框加载到管理添加/编辑屏幕之前发出 API 请求。一旦加载任何帖子/页面/自定义帖子类型的添加/编辑页面,就会触发该特定操作挂钩。为了缩小范围,使该功能仅在我的“产品”自定义帖子类型的添加/编辑屏幕上触发,我使用了 get_current_screen() 和 if 语句。

add_action('edit_form_top', 'llc_hook_campaign_find_active');
function llc_hook_campaign_find_active() 
    //Fetch current screen information
    $screen = get_current_screen();
    //Check if post type is "product"
    if($screen->post_type == "product") 
        //API Request that checks for an existing transient
        $t_campaign_find_active = get_transient('campaign_find_active');
        if (!$t_campaign_find_active)
            limelight_cart_campaign_find_active();
            return false;
        
    

像魅力一样工作。

【讨论】:

【参考方案2】:

由于您使用的是动作挂钩,因此它不会等待您的 API 响应。 请尝试使用过滤器挂钩。

尝试使用wp_insert_post_data

function filter_handler( $data , $postarr ) 

  //make your API call, get the response and store it in post meta or data wherever you want
  $response = 'your API response';

  //e.g. update_post_meta($postarr['ID'], 'meta_key', $response); OR
  //$data['post_content'] = $response;

  return $data;


add_filter( 'wp_insert_post_data', 'filter_handler', '99', 2 );

在你的情况下,以下应该工作 -

add_filter( 'wp_insert_post_data', 'llc_hook_campaign_find_active', '99', 2 );

function llc_hook_campaign_find_active( $data , $postarr ) 
    if (!$t_campaign_find_active)
        limelight_cart_campaign_find_active();
        return $data;
    

【讨论】:

以上是关于自定义帖子类型动作挂钩/瞬态的主要内容,如果未能解决你的问题,请参考以下文章

通过自定义帖子类型中的字段分配模板的过滤器或操作挂钩

使用操作挂钩创建自定义Wordpress REST API端点

WordPress 自定义帖子类型单一作为存档的父级

在 WordPress 中更新自定义 PageLine 的部分时的操作挂钩

如何为 React Action Hook Store 定义 Typescript 属性和类型

主题动作挂钩一次性功能