为什么只在特定的定制帖子类型上有条件地加载定制插件的代码会导致网站内容消失?

时间:2019-12-20 作者:davemackey

我正在开发一个填充空白插件(https://github.com/liquidchurch/lqd-notes) 这一直在起作用。

我意识到插件正在加载它的样式js,并在每个页面上插入一个div,而不仅仅是它自己的自定义帖子类型(“lqdnotes”)。因此,我使用了一个简单的if语句来确保只有在cpt存在时才传递代码。

它发生在以下位置:

lqd-notes.php

function lqdnotes_enqueue_css() {
    if ( get_post_type( get_the_ID() ) == \'lqdnotes\' ) {
        $lqdcssversion = filemtime( LQDNOTES_DIR . \'public/css/lqdnotes.css\' );
        wp_enqueue_style(
            \'lqdnotes-css\',
            plugins_url(  \'public/css/lqdnotes.css\', __FILE__ ),
            array(),
            $lqdcssversion
        );
    }
}

add_action( \'enqueue_block_assets\', \'lqdnotes_enqueue_css\' );

public/display-filled.php

function lqdnotes_enqueue_display_filled() {
    if ( get_post_type( get_the_ID() ) == \'lqdnotes\' ) {
        $lqdfilterinputversion = filemtime( LQDNOTES_DIR . \'public/js/lqdnotes-filter-inputs.js\' );
        wp_enqueue_script(
            \'lqdnotes-filter-inputs\',
            LQDNOTES_URL . \'public/js/lqdnotes-filter-inputs.js\',
            array( \'jquery\' ),
            $lqdfilterinputversion
        );

        $ajax_array = array(
            \'ajax_url\' => admin_url( \'admin-ajax.php\' )
        );

        wp_localize_script(
            \'lqdnotes-filter-inputs\',
            \'lqdnotes_ajax\',
            $ajax_array );
    }
}
add_action( \'wp_enqueue_scripts\', \'lqdnotes_enqueue_display_filled\' );

public/modify-display.php

function lqdnotes_enqueue_display_blanks() {
    if ( get_post_type( get_the_ID() ) == \'lqdnotes\' ) {
        $lqdfilterspanversion = filemtime( LQDNOTES_DIR .\'public/js/lqdnotes-filter-span.js\' );
        wp_enqueue_script(
            \'lqdnotes-filter-spans\',
            plugin_dir_url( __FILE__ ) . \'js/lqdnotes-filter-span.js\',
            array(),
            $lqdfilterspanversion
        );
    }
}
add_action( \'wp_enqueue_scripts\', \'lqdnotes_enqueue_display_blanks\' );
function lqdnotes_add_div( $content ) {
    if ( get_post_type( get_the_ID() ) == \'lqdnotes\' ) {
        $updated_content = \'<div id="message-notes" class="message-notes">\' . $content . \'</div>\';
        return $updated_content;
    }
}
add_filter( \'the_content\', \'lqdnotes_add_div\' );
当我将插件和浏览器激活到一个内容页面(比如test.liquidchurch.com)时,页眉和页脚会显示出来,但没有页面内容。。这发生在不属于CPT的页面上。

但是,如果我打开其中一个CPT页面,所有内容都会正确显示(请参阅https://test.liquidchurch.com/blog/notes/breakthrough/).

查看测试页面上的内容。液化教堂。com应该看起来像去liquidchurch。com。可以看到,页面中有内容,如果我在测试中禁用notes插件。液化教堂。com它也会出现在那里(在解决这个问题之前,我已经在live站点上禁用了插件)。

2 个回复
SO网友:butlerblog

我知道你已经回答了你的问题。然而,我认为还有一些额外的解释可以让问题和解决方案更加清晰。

问题是你lqdnotes_add_div() 作用这是挂接在过滤器上的-the_content.

在WordPress中,无论何时使用过滤器,过滤器函数都必须为要过滤的项目返回一个值。这可能是字符串、数组或布尔值。在这种情况下,$content 是字符串,必须返回字符串。

仅当post类型为“lqdnotes”时,筛选函数才返回值。在所有其他情况下,返回空值。

而您确实需要为$content, 您不需要使用else 条件事实上,一个好的标准做法是确保在任何过滤函数的末尾至少有一个返回值,以便在函数的任何其他条件不满足时返回未过滤的结果。

function lqdnotes_add_div( $content ) {
    if ( get_post_type( get_the_ID() ) == \'lqdnotes\' ) {
        $updated_content = \'<div id="message-notes" class="message-notes">\' . $content . \'</div>\';
        return $updated_content;
    }
    return $content;
}
add_filter( \'the_content\', \'lqdnotes_add_div\' );

SO网友:davemackey

StackOverflow可能是我的rubber duck. 几乎在发表这个问题后,我马上想到了解决办法。

问题出在功能上lqdnotes_add_div. 此函数需要$content (帖子内容)作为参数。如果post不是类型lqdnotes 然后它没有对$content...至少我是这么想的。

PHP actually returns null 如果未指定返回值,那么实际执行的操作$content - 将其设置为null。

添加一个else子句,该子句显式返回$content 我收到了问题修复:

function lqdnotes_add_div( $content ) {
    if ( get_post_type( get_the_ID() ) == \'lqdnotes\' ) {
        $updated_content = \'<div id="message-notes" class="message-notes">\' . $content . \'</div>\';
        return $updated_content;
    } else {
        return $content;
    }
}

相关推荐

Conditional action hooks

我正在开发一个使用AJAX的插件,但我在控制代码流方面遇到了困难。我想在运行条件后挂接函数。我的钩子在控制结构内部添加时不会启动,但在外部会启动。我还有一个触发AJAX请求的事件,这只能在用户点击触发事件后,在加载所有DOM之后发生。AJAX请求告诉PHP函数设置cookie。它设置了cookie,但在阅读关于cookie的PHP文档时,我发现它们只能在发送任何输出后设置,但我还是做到了这一点?我读过WordPress初始化序列,但这并没有帮助我解决这个问题。这是我的密码:add_action(\'wp_