get_the_content() 和无限嵌套循环中的 wordpress 简码

wordpress shortcode within get_the_content() and infinite nested loop

首先,对于这么长的主题,我深表歉意,但我没有找到其他方式来解释这个问题...

我遇到了在 get_the_content() 内执行短代码以及管理可能发生的无限嵌套循环的问题。

我的插件被用作短代码来显示作为参数传递的特定类别列表的 posts。 短代码也可以在页面、post 或小部件上使用。 可以这样总结:

Root Post/Page/Widget body with [shortcode category_slug_list="category_slug1"]
  =>  post 1 of category with slug1 is displayed
      post 2 of category with slug1 is displayed
      ...
      ...
      post n of category with slug1 is displayed

每个 post 在循环中显示为:

$content = get_the_content();  
$content = apply_filters('the_content', $content);

如果它用在 post 上,这里的主要问题是 post 不能属于短代码指定的类别之一,以避免无限嵌套循环。

当属于其中一个类别的 post 处于 第一层深度 时,此管理通过以下方式完成:

if (is_single()) {
    if (in_category($category_slug_array)) {
        // The function must not proceed with this post !!!
        $out = '<div>To proceed inside a post, the post MUST not belong to one of the categories asked by "category_slug_list" option, to avoid infinite nested loop...</div>';
        return $out;
    }
}

之所以有效,是因为 (is_single) 与第一层深度相关,这里第一层是 post。

但是,例如,当第一层深度是一个页面时,当显示的 post 中的一个有自己的短代码时,就会出现问题。 由于 post 的内容是用 get_the_content() 检索的,当执行其中的短代码时,我找不到检索上下文的方法,因为 is_single() returns false 因为它与根页面相关,而不是我们从中获得 get_the_content() 值的当前 post。

示例:

Root Page body with [shortcode category_slug_list="category_slug2"]
  =>  post 1 of category with slug2 displayed
      post 2 of category with slug2 displayed
             post 2 body with [shortcode category_slug_list="category_slug2"]
      ...
      ...
      post n of category with slug2 displayed

从这个例子中,有没有办法获取“post 2”上下文,我的意思是验证它是一个 post,然后检查它上面的 in_category 函数? 欢迎任何线索、想法、建议...

所以,我终于找到了解决办法:

我发现的唯一方法是能够将 post id 作为属性传递给嵌套的简码。

在短代码函数中,在 posts 循环中,如果找到短代码,我在 post 内容中使用 str_ireplace 添加属性:

$content = str_ireplace("[shortcode-function-name",'[shortcode-function-name post_id="'.$post->ID.'"',$content);

所以,在短代码函数的开头,我检索了 post_id 属性:

extract(shortcode_atts(array(
        "post_id" => '',
        "other_attribute" => 'default_value',
        ...
        ...
        "last_attribute" => 'default_value'
    ), $atts));

然后,除了首先检查 root post 的情况外,我现在可以使用 post ID 进行检查:

if ($post_id) {
    if (in_category($category_slug_array,$post_id)) {
        // The function must not proceed with this post !!!
        $out = '<div>To proceed inside a post, the post MUST not belong to one of the categories asked by "category_slug_list" option, to avoid infinite nested loop...</div>';
        return $out;
    }
}

万一它可以帮助那些试图根据 post 具体情况在嵌套循环中使用简码函数的人...