【问题标题】: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;
    }
}

【问题讨论】:

    标签: wordpress


    【解决方案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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 2015-02-21
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多