更新帖子内容仅适用于二十世纪主题(_P)

时间:2020-08-06 作者:EliT

编辑:多亏了@mozboz,我找到了解决这个问题的方法。这篇文章已经更新,以反映我最初是想做什么,以及我现在正在做什么。

我正在开发一个插件,它创建一个自定义帖子类型,向其中添加一些元字段,然后以特定格式显示该元信息。元字段用于YouTube链接和mp3链接,插件显示这些链接的选项卡式内容(第一个选项卡是嵌入式YouTube播放器,第二个选项卡是嵌入式音频播放器,第三个选项卡是mp3的下载链接)。它在二十二十个主题上效果很好,但在我尝试过的其他主题上都没有。这是我的原始代码:

function my_custom_post_type_the_post($post_object)
{
    // The post object is passed to this hook by reference so there is no need to return a value.
    if(
        $post_object->post_type == \'my_custom_post_type\' &&
        ( is_post_type_archive(\'my_custom_post_type\') || is_singular(\'my_custom_post_type\') ) &&
        ! is_admin()
    ) {

        $video = get_post_meta($post_object->ID, \'my_custom_post_type_video_url\', true);
        $mp3 = get_post_meta($post_object->ID, \'my_custom_post_type_mp3_url\', true);
        $textfield = get_post_meta($post_object->ID, \'my_custom_post_type_textfield\', true);

        // Convert meta data to HTML-formatted media content
        $media_content = $this->create_media_content($video, $mp3, $bible);

        // Prepend $media_content to $post_content
        $post_object->post_content = $media_content . $post_object->post_content;
    }
}
add_action( \'the_post\', \'my_custom_post_type_the_post\' );
在这个函数的末尾,我使用print\\u r($post\\u content)来验证条件是否按预期工作,以及$post\\u对象是否包含我所期望的内容。出于某种原因,《二十二零》主题将显示$media\\u内容,但对于其他主题,它仍然缺失。

我决定,也许是我误用了;“\\u post”;钩我试图修改我的插件以使用;\\u内容“;钩子代替了,这让它起作用了:

    public function my_custom_post_type_the_content($content_object)
    {
        global $post;
        if(
            $post->post_type == \'my_custom_post_type\' &&
            ( is_post_type_archive(\'my_custom_post_type\') || is_singular(\'my_custom_post_type\') ) && ! is_admin()
        ) {

            $video = get_post_meta($post->ID, \'my_custom_post_type_video_url\', true);
            $mp3 = get_post_meta($post->ID, \'my_custom_post_type_mp3_url\', true);
            $textfield = get_post_meta($post->ID, \'my_custom_post_type_text_field\', true);

            $media_content = $this->create_media_content($video, $mp3, $textfield);

            $content_object = $media_content . $content_object;
        }
        return $content_object
    }
add_filter( \'the_content\', \'my_custom_post_type_the_content\');
请注意$content\\u object“;传递给函数的不是通过引用传递的,因此必须返回它。

有一件事没有解决,那就是使用这种方法,帖子的归档列表会剥离所有HTML,这样我的媒体对象就会从归档列表中消失。在我的例子中,我决定不解决这个问题,因为我决定在归档页面上为多篇文章加载所有这些媒体对象会对页面加载次数产生太大的负面影响。

再次感谢您的帮助!

2 个回复
SO网友:mozboz

由于您的代码看起来非常通用,显而易见的答案和需要调试的事情是if 条件在您预期的情况下不为真,或$media_content 没有按照您的预期生成。

您是否百分之百确定在所有其他网站上post_type\'my_custom_post_type\' 你预计什么时候?

您可以通过临时插入以下代码来调试类似的内容:

function my_custom_post_type_the_post($post_object)
{
    $post_object->post_content = "debug: " . ( $post_object->post_type == \'my_custom_post_type\' ? "yes" : "no" ) . $post_object->post_content;

    $media_content_test = generate_media_content( ... ); // make this stuff self contained so it\'s easy to test

    $post_object->post_content = "debug: " . $media_content_test . $post_object->post_content;

    // original code below

    // The post object is passed to this hook by reference so there is no need to return a value.
    if(
通过这种方式,您可以了解以下内容:

钩子肯定跑了

  • 您所期望的条件实际上是否为真
  • 您所期望的输出正在正确生成

  • SO网友:EliT

    在@mozboz的帮助下,我解决了我的问题。原始帖子更新了答案。然而,无论出于什么原因,人们都要求我也在这里张贴答案。这就是:

    public function my_custom_post_type_the_content($content_object)
    {
        global $post;
        if(
            $post->post_type == \'my_custom_post_type\' &&
            ( is_post_type_archive(\'my_custom_post_type\') || is_singular(\'my_custom_post_type\') ) && ! is_admin()
        ) {
    
            $video = get_post_meta($post->ID, \'my_custom_post_type_video_url\', true);
            $mp3 = get_post_meta($post->ID, \'my_custom_post_type_mp3_url\', true);
            $textfield = get_post_meta($post->ID, \'my_custom_post_type_text_field\', true);
    
            $media_content = $this->create_media_content($video, $mp3, $textfield);
    
            $content_object = $media_content . $content_object;
        }
        return $content_object
    }
    
    添加\\u筛选器(“the\\u content”、“my\\u custom\\u post\\u type\\u the\\u content”);

    相关推荐