apply_filters('the_content',$ content)与do_shortcode($ content)


21

可以说我有一个主题选项或自定义的postmeta文本区域。现在,我想执行多个短代码,常规文本,图像等。

什么是最佳做法,为什么?

选项1:

$content = //my text area data;
echo apply_filters('the_content', $content);

选项2:

$content = //my text area data;
echo do_shortcode($content);

请向我解释哪种方法是最佳做法,为什么。

编辑

让我详细描述该方案。我根据客户的要求开发主题。有时,我需要在帖子/页面/自定义帖子类型上添加帖子元,以便他们可以添加短代码(滑块,联系表格等)或仅添加简单文本。这是一个文本字段。

为了使短代码有效,我使用了选项1。现在,我从某人那里听说这是错误的方法,应该使用do_shortcode。但是他们没有给我解释为什么这是错误的方式。这就是为什么我问。

这整个过程可以在wp的默认文本编辑器中完成。但是我需要为模板的特定用途创建这些选项,这是我的客户想要的。

Answers:


16

问题和答案进行了修订

有时候,这些问题会困扰您,并在以后的生活中再次追捕您,这就是一个这样的问题。

这个问题让我考虑了该问题的替代解决方案。就像我已经说过的那样,自定义字段和元框用于存储少量的元数据,而不是充当发布内容的扩展,您可以在其中执行简码和功能。另外,正如我已经说过的,您的方法不正确,不应使用

我在您的文章中发现有趣的是,您使用自定义字段和元框无意中显示了来自用户输入的自定义内容。所以我坐下来,想出一种可行的方法来完成这项工作,并正确使用自定义字段数据和元框数据

这是我的主意:

场景:

注意:可以对其进行修改以适合任何需要

在单个帖子上,用户希望/要求在帖子之后动态显示自定义内容以适应其需求。这应该是动态的。内容应为自定义查询,用户需要选择要显示的内容以及所需的内容

可能的解决方案:

简码在这里不起作用,因为简码不能在自定义字段中执行。两者都do_shortcode不起作用,因为它不是动态的并且是硬编码的,这是我们不想要的。就像您的问题一样,我们将使用自定义字段。再次强调,请勿使用自定义字段执行自定义查询或简码

计划:

我们将使用定制字段保存查询参数,仅此而已。因此,我们要做的是创建一个名为的自定义字段custom_query_arguments。在您的帖子编辑器屏幕中,您现在将看到可以使用的自定义字段

下一步将是将自定义查询参数添加到字段中。可以说,我们需要显示类别1中的3个帖子(按标题排序)。因此,我们的查询参数应如下所示:(以字符串格式

'posts_per_page=3&cat=1&orderby=title'

这就是您现在应该在自定义字段中输入的内容。输入后,保存您的自定义字段的值

接下来将在您的single.php中构造自定义查询。这里需要的是,我们需要从自定义字段中获取值,该值实际上是我们的查询参数,并将其提供给的新实例WP_Query以检索帖子。我们还需要检查我们是否在该自定义字段中保存了一个值,如果自定义字段为空,则不显示任何内容

代码:

您可以在单篇文章发布后在single.php中尝试类似的操作。

$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// check if the custom field has a value
if( ! empty( $args ) ) {

    $q = new WP_Query( $args );

    if( $q->have_posts() ) {
        while( $q->have_posts() ) {
            $q->the_post();

            the_title();

        }
        wp_reset_postdata();
    }

} 

如果用户要删除自定义查询,则只需删除自定义字段的值并将自定义字段留空即可。如果他需要显示相同的查询,但来自类别10和总共5个帖子,则可以将原始值替换为以下内容:

'posts_per_page=5&cat=10&orderby=title'

注意事项:

在此自定义字段和元框中输入信息时,请使用正确的语法和格式,这一点很重要。语法错误或不正确的信息将导致不希望的输出甚至致命错误。让您的客户了解此类信息非常重要

原始答案

我不了解您要完成的工作,但是据我所知,这是两件事

选项1

apply_filters('the_content', $content);用于将内容过滤器应用于未过滤的原始帖子内容,通常来自的使用$post->post_content。这些过滤器包括著名的过滤器wp_autop,它将p标签添加到the_content()

apply_filters('the_content', $content); 通常用于与不使用而get_posts直接使用WP_Post对象的情况结合使用setup_postdata( $post ),从而使模板标签the_content() 可用

选项2

do_shortcode 用于在页面编辑器屏幕后端的文本编辑器外部的模板文件中的任何位置添加简码,基本上是通过其钩子过滤简码。

正确用法如下

示例:在模板文件中添加画廊简码

echo do_shortcode( '[gallery]' )

编辑1

根据您的评论,我将不再使用简码。

如果您不打算通过文本编辑器添加简码,而是要通过do_shortcode模板文件直接添加(硬编码),我宁愿将函数添加到模板中

例:

如果您具有以下简码功能

function footag_func( $atts ) {
    return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );

您可以直接在模板中直接调用该函数,例如

echo footag_func();

这种方式速度更快,因为不需要解析短代码

编辑2

老实说,您所做的编辑完全是错误的。这就是为什么我不明白你最初的问题

有时,我需要在帖子/页面/自定义帖子类型上添加帖子元,以便他们可以添加短代码(滑块,联系表格等)或仅添加简单文本。这是一个文本字段。

为了使短代码有效,我使用选项1 .....

自定义字段不是文本字段,并且肯定不是要用来执行的简并为此事滑块或接触形式。自定义字段绝不能用于替换帖子和页面中的文本编辑器。

如前所述,apply_filters('the_content', $content);它用于将格式应用于原始帖子内容。

你有两个选择

  • 使用do_shortcode直接在模板文件,我不建议为使用功能操作起来也更短码不需要解析

  • 直接在文本编辑器中为特定页面/帖子使用简码

我强烈建议您对您的结构和要达到的目标进行全新的了解。自定义字段不是文本编辑器,不能执行短代码或滑块。

我的建议是研究自定义小部件或可以与自定义字段一起使用的系统


1
彼得感谢您的解释。我已经知道了 但是我在问,如果目标仅是从后元/主题选项文本区域输出短代码,则哪个选项会更准确。我正在使用option1来获取过滤的内容,这成了我的习惯。甚至可以使用选项1来仅打印文本文件中的简码。所以问。
тнє苏菲

我看到了编辑。我明白你的意思。但是我的情况不同。就像有一个文本字段/区域,以及几个短代码。现在,用户可以在该区域中输入任何简码。所以我不能直接使用功能。我需要保持这一部分的动态。
тнє苏菲

该文本字段在哪里,与后端页面编辑器屏幕中的文本字段相同
Pieter Goosen 2015年

它可以是发布元。或者它可以是主题选项。我对两者都使用the_content过滤器。
тнє苏菲

抱歉,但是所有这些都没有道理。为什么要在自定义字段中使用简码。那么,为什么还要使用简码呢?
Pieter Goosen 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.