内容顶部的短码输出(_C)

时间:2012-11-18 作者:markratledge

此函数生成的短代码(多站点中所有站点的列表)输出到循环中内容的上方,无论它放置在编辑器中的何处。

我已经查看了WPSE上的其他相关问题和答案,并意识到这与使用echo 而不是return, 但这并不像替换echo 具有return 在下面的函数中。或添加echo=0 具有WP功能,如wp_list_pages()

有什么想法吗?需要返回而不是回显的函数在哪里?

// Output a single menu item
function projects_menu_entry($id, $title, $link_self)
{
    global $blog_id;
    if ($link_self || $id != $blog_id) {
        echo \'<li>\';
        if ($id == $blog_id) {
            echo \'<strong>\';
        }
        $url = get_home_url($id);
        if (substr($url, -1) != \'/\') {
            // Note: I added a "/" to the end of the URL because WordPress
            // wasn\'t doing that automatically in v3.0.4
            $url .= \'/\';
        }
        echo \'<a href="\' . $url . \'">\' . $title . \'</a>\';
        if ($id == $blog_id) {
            echo \'</strong>\';
        }
        echo \'</li>\';
    }
}

// Output the whole menu
// If $link_self is false, skip the current site - used to display the menu on the homepage
function projects_menu($link_self = true)
{
    global $wpdb;

    echo \'<ul>\';

    projects_menu_entry(1, \'Home\', $link_self);

    $blogs = $wpdb->get_results("
        SELECT blog_id
        FROM {$wpdb->blogs}
        WHERE site_id = \'{$wpdb->siteid}\'
        AND spam = \'0\'
        AND deleted = \'0\'
        AND archived = \'0\'
        AND blog_id != 1
    ");

    $sites = array();
    foreach ($blogs as $blog) {
        $sites[$blog->blog_id] = get_blog_option($blog->blog_id, \'blogname\');
    }

    natsort($sites);
    foreach ($sites as $blog_id => $blog_title) {
        projects_menu_entry($blog_id, $blog_title, $link_self);
    }
    echo \'</ul>\';
}

// Adds a [bloglist] shortcode

function bloglist_shortcode($atts)
{
    projects_menu(false);
}

add_shortcode(\'bloglist\', \'bloglist_shortcode\');

4 个回复
最合适的回答,由SO网友:fuxia 整理而成

所有功能都必须return 字符串,不应使用echo 在任何地方重写函数,使用内部变量处理字符串并返回:

// Output a single menu item
function projects_menu_entry($id, $title, $link_self)
{
    global $blog_id;
    $out = \'\';

    if ($link_self || $id != $blog_id) {
        $out .= \'<li>\';
        if ($id == $blog_id) {
            $out .= \'<strong>\';
        }
        $url = get_home_url( $id, \'/\' );

        $out .= \'<a href="\' . $url . \'">\' . $title . \'</a>\';
        if ($id == $blog_id) {
            $out .= \'</strong>\';
        }

        $out .= \'</li>\';
    }

    return $out;
}

// Output the whole menu
// If $link_self is false, skip the current site - used to display the menu on the homepage
function projects_menu($link_self = true)
{
    global $wpdb;
    $out = \'<ul>\';

    $out .= projects_menu_entry(1, \'Home\', $link_self);

    $blogs = $wpdb->get_results("
        SELECT blog_id
        FROM {$wpdb->blogs}
        WHERE site_id = \'{$wpdb->siteid}\'
        AND spam = \'0\'
        AND deleted = \'0\'
        AND archived = \'0\'
        AND blog_id != 1
    ");

    $sites = array();
    foreach ($blogs as $blog) {
        $sites[$blog->blog_id] = get_blog_option($blog->blog_id, \'blogname\');
    }

    natsort($sites);
    foreach ($sites as $blog_id => $blog_title) {
        $out .= projects_menu_entry($blog_id, $blog_title, $link_self);
    }
    $out .= \'</ul>\';

    return $out;
}

// Adds a [bloglist] shortcode

function bloglist_shortcode($atts)
{
    return projects_menu(false);
}

add_shortcode(\'bloglist\', \'bloglist_shortcode\');
有关类似的扩展示例,请参见:How to return loop contents.

SO网友:s_ha_dum

无法替换的实例echo 因为你只能回来一次。您需要构建一个字符串并返回该字符串。

function projects_menu_entry($id, $title, $link_self)
{
    global $blog_id;
    $ret = \'\';
    if ($link_self || $id != $blog_id) {
        $ret .= \'<li>\';
        if ($id == $blog_id) {
            $ret .= \'<strong>\';
        }
    // and so on
    $ret .= \'</ul>\';
    return $ret;
}
对这两个函数都这样做,我希望这会起作用。如果我严重误读了某些内容,请道歉。

SO网友:Chris_O

有什么想法吗?需要返回而不是回显的函数在哪里?

我将提供一种替代解决方案,它不需要您替换echo实例或构建返回字符串。

您可以打开输出缓冲并将缓冲区作为字符串返回。

添加ob_start() 在任何回显调用之前返回函数的开头。

在函数末尾添加:

$response = ob_get_contents();
ob_end_clean();
return $response;

SO网友:WPZA

Short and quick answer:

你应该return 您的输出,而不是echo 信息技术

$output = \'first\';
$output .= \'second\'; //notice the dot (.=) after the first variable
$output .= \'third\';
return $output;

结束

相关推荐

Add_ShortCode()在函数内不起作用

我有一个自定义的帖子类型bhour, 带字段bh_shortcode. 保存这种类型的帖子时,我希望它根据帖子的值bh_shortcode.如果bh_shortcode 是“test”,当一个[测试]快捷码标记出现在一个普通的post类型上时,不会发生任何事情--[测试]文本不会被替换。如果我放置add_shortcode(\'test\',\'save_bhour_details\'); 在功能之外,将替换[测试]文本。如何使用add_shortcode 函数内部的另一个函数?function bhou