问题描述

让我说我有一个主题选项或自定义 postmeta 文本区域。现在我要执行多个短码,一般文字,图像等

什么是最佳实践,为什么?

选项 1:

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

选项二:

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

请说明哪一个是最佳实践,为什么。

编辑

让我详细描述这种情况。我根据自己的要求为客户开发主题。有时,我需要在 post /pages /custom post 类型中添加 post meta,这样他们可以添加短节数 (滑块,联系表单等) 或者只是一个简单的文本。这是一个文本文件。

为了使短码工作,我使用选项 1. 现在,我听到有人说这是一个错误的方式,我应该使用 do_shortcode 。但是他们没有给我解释为什么这是错误的方式。这就是为什么我问。

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

最佳解决方案

问题和答案修改

有时候,这些问题有时候会让你失望,再次在生活中追捕你,这就是一个这样的问题。

这个问题让我想到了解决这个问题的另一种解决方案。正如我已经说过的那样,自定义字段和元框存储小数据元数据,而不是作为扩展内容的扩展,您可以在其中执行短代码和函数。另外,正如我已经说过的,你的方法不正确,不应该使用

我发现在您的帖子中发现有趣的是,您使用自定义字段和元框无意中显示用户输入中的自定义内容。所以我坐下来思考一个可能的方式来做这个工作,并正确地使用自定义的字段数据和元框数据

这是我的想法:

场景:

注意:可以根据需要进行修改

在单个帖子上,用户希望/要求在帖子后动态显示自定义内容以满足他的需要。这应该是动态的。内容应该是一个自定义查询,用户需要选择什么,他想要什么,他想要什么

可能的解决方案:

短信码在这里不起作用,因为在自定义字段中不能执行短码。 do_shortcode 也不会工作,因为它不是动态的,是硬编码的,我们不想要的。在您的问题中,我们将使用自定义字段。再次强调,不要使用自定义字段来执行自定义查询或缩写

计划:

我们将使用自定义字段来仅保存我们的查询参数,即全部。那么我们所做的就是创建一个名为 custom_query_arguments 的自定义字段。在您的帖子编辑器屏幕中,您将看到您的自定义字段,随时可以使用

下一步是将我们的自定义查询参数添加到我们的字段中。让我们说,我们需要显示 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'

请注意:

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

原始答案

我不明白你正在试图完成什么,但是从我可以告诉你的那些,这是两件事情

选项 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( '' )

编辑 1

从你的意见,我不会使用一个短码。

如果您不通过文本编辑器添加一个短码,并直接通过 do_shortcode 在模板文件中添加它 (硬编码),那么我宁愿将该功能添加到模板中

例:

如果您有以下短代码功能

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

您可以直接在模板中直接调用函数

echo footag_func();

它的速度要快得多,因为短码不需要解析

编辑 2

说实话,你从编辑中完全错了。这就是为什么我不明白你的初步问题

Sometimes, I need to add post meta on post/pages/custom post types, so that they can add shortcodes (slider, contact form etc) or just a simple text. It’s a text filed.

To make the shortcode working, I use option 1…..

Custom fields 不是文本字段,肯定不是用于执行快捷键和滑块或联系表单。不应该使用自定义字段来替换文章和页面中的文本编辑器。

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

你有两个选择

  • 使用 do_shortcode 直接在模板文件中,我不建议使用该功能更快,因为短代码不需要解析

  • 在文本编辑器中直接使用短代码进行特定的页面/帖子

我会认真地建议您重新整理您的结构以及您想要实现的目标。自定义字段不是文本编辑器,不能执行缩写或滑块。

我的建议是看看可能是自定义小工具或可以与自定义字段一起使用的系统

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。