向页面添加自定义快捷代码会导致页面不带样式

时间:2018-04-19 作者:Elian

Scenario i wanted to build

人们可以在我的WordPress环境中多次使用可重用组件。

My solution for the problem

我制作了一个名为“Componenten”的自定义帖子类型。我制作了一个自定义的短代码,以便在“Componenten”帖子类型中只显示一篇帖子,并将帖子的名称用作短代码参数。以下是我的短码代码和以下函数:

<?php

/**
 * Register all shortcodes
 *
 * @return null
 */
function register_shortcodes() {
    add_shortcode( \'component\', \'shortcode_components\' );
}
add_action( \'init\', \'register_shortcodes\' );

function shortcode_components( $atts ) {
    global $wp_query,
           $post;
    $component_name = $atts[\'naam\'];

    $loop = new WP_Query( array(
        \'post_type\'         => \'componenten\',
        \'name\'              => $component_name
    ) );

    if( ! $loop->have_posts() ) {
        return false;
    }

    while( $loop->have_posts() ) {
        $loop->the_post();
        return the_content();
    };

    wp_reset_postdata();
}

Problem

快捷码工作正常,它根据名称检索自定义帖子类型并显示它。然而例如,当我用短代码更新wordpress中的页面时[component naam="test"] 我更新了页面,它重定向到显示帖子的页面,没有任何样式。它不会循环回我添加短代码的管理编辑页面。每隔一页都可以。只有在添加自定义快捷码时才会出现这种情况。所以问题出在我的短代码中的某个地方。

Things i\'ve tried

我已经注释掉了函数的不同部分,以查看发生了什么。当我发表评论时,问题没有发生:

while( $loop->have_posts() ) { $loop->the_post(); return the_content(); };

但是,不用说,我的短代码当然不再有效了。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

短代码需要return 他们的价值观,但是the_content() echo编辑帖子内容。

所以你有两个选择。首先是捕获所有输出,然后在最后返回:

ob_start(); // Start capturing output;

while( $loop->have_posts() ) {
   $loop->the_post();
   the_content();
};

wp_reset_postdata();

return ob_get_clean(); // Return captured output;
如果您想捕获HTML和模板标记或部分的输出,这将是最干净的方法。

另一个选项是将内容放入变量中。“get”等效于the_content()get_the_content(), 但它会尝试使用“阅读更多”标签等奇怪的东西,所以最简单的方法就是获取原始信息$post->post_content 使用the_content 应用的筛选器:

global $post;

// etc. etc.

while( $loop->have_posts() ) {
   $loop->the_post();
   $content = apply_filters( \'the_content\', $post->post_content );
};

wp_reset_postdata();

return $content;
还要注意如何代替return在循环内部,我将值放入一个变量中,并在最后返回它。这是因为如果在函数的前面返回wp_reset_postdata() 将永远不会运行,这可能会导致页面上的其他循环出现问题。

结束

相关推荐

如何在选项表格中保存wp_EDITOR html内容

wp_editor( $default_content, $editor_id,array(\'textarea_name\' => $option_name,\'media_buttons\' => false,\'editor_height\' => 350,\'teeny\' => true) ); submit_button(\'Save\', \'primary\'); 我想创建一个邮件模板,管理员可以在其中更改内容并将快捷码放在他想要的地