【问题标题】:WordPress publish_{$post_type} hook works only for posts and not for custom post types or pagesWordPress publish_{$post_type} 钩子仅适用于帖子,不适用于自定义帖子类型或页面
【发布时间】:2020-07-12 13:03:50
【问题描述】:

我正在尝试在发布任何帖子、自定义帖子类型或页面时发送推送通知。我正在从插件设置中启用帖子类型,并通过foreach 循环在我的类__construct 方法中添加操作。问题是它仅适用于帖子,不适用于任何自定义帖子类型或页面。这是我的职能和行动:

foreach ((array)get_option('PushPostTypes') as $postType) {
    add_action("publish_{$postType}",  array($this, 'doNewPostPush'), 10, 2);
}

public function doNewPostPush($id, $post) {
    $pushData = array(
        'title' => $post->post_title,
        'body' => strip_tags($post->post_content),
        'data' => array(
            'url' => trailingslashit(get_permalink($id)),
        ),
    );

    if (has_post_thumbnail($id)) {
        $pushData['image'] = get_the_post_thumbnail_url($id);
    }
    
    $this->sendNotification($pushData);
}

get_option('PushPostTypes') 是用户选择的帖子类型数组,例如:array('post', 'page', 'custom_post');

知道为什么它只适用于 post 而不适用于页面或自定义帖子类型吗?

【问题讨论】:

    标签: wordpress wordpress-hook


    【解决方案1】:

    假设您的 get_option('PushPostTypes') 按预期工作,您的代码对我有用(显然我不得不对此进行模拟)。

    尝试不依赖get_option('PushPostTypes')的不同方法,看看是否得到相同的结果;

    add_action('transition_post_status', function ($new_status, $old_status, $post) {
        if ($new_status !== 'publish') {
            return;
        }
    
        // do something
    }, 10, 3);
    

    尝试适用于所有帖子的'transition_post_status' 钩子,无需专门定义它们。把它放在某个地方,看看它是否运行。做任何适合你的调试语句。然后 if 有效,然后将其移动到类代码中,看看是否有效。我正在通过尝试隔离第一件事出错的地方进行调试。保持它非常简单以使其工作,然后逐渐增加复杂性直到它崩溃。

    【讨论】:

    • 我尝试用 array('post', 'page', 'movies') 替换 get_option('PushPostTypes') 以确保帖子类型值不是问题,但它不适用于页面和电影,仅适用于帖子。您是否也在__construct 方法中注册了操作?它也适用于页面和自定义帖子类型吗?如果可能的话,我可以看看你的代码示例吗?
    • 另外,即使'transition_post_status'save_post 操作也不适用于页面或自定义帖子类型。它们只适用于帖子,所以我认为问题在于帖子类型在运行时没有注册。
    • 好吧,add_action 不应该关心帖子是否已注册 b/c,它会将操作保存到全局变量中,并且仅在调用 do_action 时访问那些。不是积极的,但我很确定帖子和页面也会同时注册。这可能是一个生命周期问题,但我不能仅根据此处发布的内容来判断。你熟悉分步调试吗?如果是我,那我接下来会尝试。如果没有,您能否在这两组代码执行时发布(在 WP 生命周期中)。换句话说,触发这些代码的最新 WordPress 操作是什么?
    • 问题是我根本无法让它适用于页面或自定义帖子类型。它只适用于帖子,无论是publish_{$postType}transition_post_status 还是save_post。所以我无法通过消除复杂性来逐步调试它,直到它工作为止。但是,我检查了是否通过has_action 注册了操作,并检测到publish_CPT 操作没有注册。只有注册的操作是publish_postpublish_page,但该功能仅适用于帖子而不是页面,甚至注册了页面操作。
    • 我指的是文字步骤调试,比如 xDebug,或者你最喜欢的工具(无论是什么)。我看不到您发布的代码有任何问题,所以我认为您的问题不在此范围内。您能否在问题中提供更多背景信息?具体来说,哪些 WP 钩子正在触发执行您的相关代码?老实说,我希望看到更多您从中获取代码的 sn-ps 文件。如果是我,我会在post.php 文件夹的post.php 文件中的do_action( "{$new_status}_{$post->post_type}", $post->ID, $post ); 钩子上放置断点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2023-03-31
    • 2014-10-15
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多