代码之家  ›  专栏  ›  技术社区  ›  Justin Levene

wordpress错误出现时带有自定义快捷方式功能

  •  1
  • Justin Levene  · 技术社区  · 6 年前

    我已经创建了一个简单的自定义插件,可以将文章分组:

    function custom_category_loop()
    {
        // Grab all the categories from the database that have posts.
        $categories = get_terms( 'category', 'orderby=name&order=ASC');
        // Loop through categories
        foreach ( $categories as $category )
        {
            // Display category name
            echo '<h2 class="post-title">' . $category->name . '</h2>';
            echo '<div class="post-list">';
            // WP_Query arguments
            $args = array(
                'cat' => $category->term_id,
                'orderby' => 'term_order',
            );
            // The Query
            $query = new WP_Query( $args );
            // The Loop
            if ( $query->have_posts() )
            {
                while ( $query->have_posts() )
                {
                    $query->the_post();
                    ?>
                    <div><a href="<?php the_permalink();?>"><?php the_title(); ?></a></div>
                    <?php
                } // End while
            } // End if
            echo '</div>';
            // Restore original Post Data
            wp_reset_postdata();
        } // End foreach
    }
    add_shortcode( 'my_posts_grouped', 'custom_category_loop' );
    

    然后我创建了一个页面并添加了一行

    [my_posts_grouped]
    

    我的wordpress安装是一个多站点安装,所有页面都使用相同的主题,因为我有相同的站点,但使用不同的语言(和url)。

    我的问题是,在我所有的网站上,除了一个网站,这个缺点工作得很完美。在只有一个站点上,代码在标题前和正文页内输出。

    你知道为什么以及如何解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Kirk Beard    6 年前

    WordPress快捷方式必须 返回 数据(而不是使用 echo 或类似的)。

    documentation :

    注意,shortcode调用的函数不应该产生任何类型的输出。 shortcode函数应该返回文本 这将被用来代替这个缺点。 直接产生输出将导致意外的结果。 这与筛选函数的行为方式类似,因为它们不应该从调用中产生预期的副作用,因为您无法控制从何时何地调用它们。

    事实上,你的代码只在一个网站上被破解,而不是全部,我认为这是运气使然。

    使用 return 而不是倍数 回声 打电话,可以解决你的问题:

    function custom_category_loop()
    {
        // String to return
        $html = '';
    
        // Grab all the categories from the database that have posts.
        $categories = get_terms( 'category', 'orderby=name&order=ASC');
        // Loop through categories
        foreach ( $categories as $category )
        {
            // Display category name
            $html .= '<h2 class="post-title">' . $category->name . '</h2>';
            $html .= '<div class="post-list">';
            // WP_Query arguments
            $args = array(
                'cat' => $category->term_id,
                'orderby' => 'term_order',
            );
            // The Query
            $query = new WP_Query( $args );
            // The Loop
            if ( $query->have_posts() )
            {
                while ( $query->have_posts() )
                {
                    $query->the_post();
                    $html .= '<div><a href="' . get_permalink() . '">' . get_the_title() . '</a></div>';
                } // End while
            } // End if
            $html .= '</div>';
            // Restore original Post Data
            wp_reset_postdata();
    
            // Return the HTML string to be shown on screen
            return $html;
        } // End foreach
    }
    add_shortcode( 'my_posts_grouped', 'custom_category_loop' );