当前位置: 首页 > 知识库问答 >
问题:

基于其他短代码的WordPress短代码

蒲功
2023-03-14

我有2个WordPress短代码正在使用:

  1. 一章。[章节名称="开始"]...内容...[/章]
  2. 目录[toc][/toc]。toc需要显示章节的简单列表。

规范:

  • 一篇文章可以有很多章节。
  • 帖子中可以有一个、两个或没有toc短代码。
  • toc可以在章节之前或之后,也可以在章节之前和之后。这取决于帖子作者,所以我事先不知道。
  • 我不能使用嵌套的简码,因为这些对作者来说很难使用。

我想到了使用静态toc数组在每个章节标记处添加章节,然后在toc短代码中输出。唉,toc短代码可以出现在章节之前,然后数组将是空的。

以下post html将不显示toc:

[toc][/toc]
Here is some content
[chapter name="hello"]xxx[/chapter]
In between content may come here
[chapter name="world"]yyy[/chapter]
Some more stuff

这是我的起始代码(嵌入到类中):

public static function register_chapter_shortcode($atts, $content=null){
    $atts = shortcode_atts (
        array (
            'name'       => '',
        ), $atts );

    $name = $atts["name"];
    if (self::$toc == null){
        self::$toc = array ($name);
    } else {
        array_push(self::$toc, $name);
    }
    return '
        <h2>'.$atts["name"].'</h2>
        <div>'.do_shortcode($content).'</div>'
    ;
}

public static function register_toc_shortcode($atts, $content=null){
    $items = "";
    foreach (self::$toc as $item){
        $items = $items. '<li><a href="#">'.$item.'</a></li>';
    }
    return '
        <ul>'.$items.'</ul>            
    ';
}

共有1个答案

弘伟彦
2023-03-14

问题是函数运行的顺序:register_toc_shortcoderegister_chapter_shortcode设置self::$toc之前运行,所以它没有任何显示。这意味着[toc]必须在[章节]简码之后。这样做的问题是,您需要在列出章节之前显示TOC。

正如我在评论中提到的,我可以看到两种解决方法——一种是使用javascript将TOC插入DOM,但如果可能的话,我会避免这样做。

另一种方法是使用register_chapter_shortcode将所有内容存储在self::$toc中,而不输出任何内容。然后register_toc_shortcode可以显示所有内容。

这没有经过测试,但其背后的基本逻辑应该是正确的:

public static function register_chapter_shortcode($atts, $content=null){
    $atts = shortcode_atts (
        array (
            'name'       => '',
        ), $atts );

    if (self::$toc == null)
        self::$toc = array ();

    /* add ALL info to self::$toc in an array */
    array_push(self::$toc, array("name" => $atts["name"], "content" => $content));
}

public static function register_toc_shortcode($atts, $content=null){
    /* add the ability to pass in the position of the toc, as required in your comment */
    $atts = shortcode_atts (
        array (
            'position' => 'top', /* e.g. "top" (default), "bottom", "both" */
        ), $atts );

    /* generate the HTML for the TOC */
    $toc_html = "<ul>";
    foreach (self::$toc as $item){
        $toc_html .= '<li><a href="#">'.$item["name"].'</a></li>';
    }
    $toc_html .= "</ul>";

    /* generate the HTML for the chapters */
    $chapters = "";
    foreach (self::$toc as $item){
        $chapters .= '<h2>'.$item["name"].'</h2>
        <div>'.do_shortcode($item["content").'</div>';
    }

    /* generate the output, putting the TOC at the top or bottom as required */
    $html = "";
    if ($position == "top" || $position == "both") $html .= $toc_html;
    $html .= $chapters;
    if ($position == "bottom" || $position == "both") $html .= $toc_html;

    return $html;
}

然后您可以按如下方式使用它:

[chapter name="hello"]xxx[/chapter]
[chapter name="world"]yyy[/chapter]
[toc position="top"][/toc]

注意:[toc]始终必须在章节之后,以便为[toc]设置它们来显示详细信息。

 类似资料:
  • 我有一个短代码(outputURL),用于将值输出到URL中。该值从短代码(valueURL)中检索。valueURL输出是文本包装在div中: 我只需要textForURL值,不包括div标记。到目前为止,我只能输出div标记和文本,而不能输出纯文本的干净版本。 这是我的简码函数: 我进行了研究,并能够将其整合在一起,但我不确定我是否朝着正确执行的方向前进。任何能帮助我实现目标的人都将不胜感激。

  • 我有某种短代码,如。 我想从中提取这个短代码,然后将这两个属性:和发送到SDL World Server进行翻译。 从SDL得到响应后,我想相应地替换那个短代码。 有什么建议或帮助吗?

  • 我需要围绕WordPress的短代码翻译的内容。这些是问题的先决条件: 我必须围绕“短代码”,而不是短代码的内容。例如

  • 我正在制作wordpress插件,我想用短代码在帖子中插入一些非常庞大的代码。我得到了这个模拟我的问题的简单代码 并发布此内容 给出了这样的结果: 我希望它在开始和结束之间插入“通缉”文本。我知道最简单的解决方案是在want()中返回“want”,但我已经有了所有这些函数,它们非常庞大。有没有一个简单的解决方案,而不必从头开始写? @编辑:也许有什么方法可以将函数的所有回音存储在字符串中而不打印?

  • 我有一个wordpress插件,可以上传用户头像。我正在尝试使用一段显示缩略图的代码,并将其放在一个短代码中,这样我就可以将缩略图放在网站的任何位置。 我对php比较陌生,我知道如何为wordpress启动一个短代码,但我不知道如何构造短代码来承载php。有谁能给我提个建议吗? php下面的代码是插件文件的原文: 我想放在短代码中的代码如下,基本上它显示了缩略图。我试图用这个在functions.

  • 我只想在我的wordpress主题菜单栏中添加一个快捷键,用于处理功能。 我尝试了在菜单中使用“