此函数生成的短代码(多站点中所有站点的列表)输出到循环中内容的上方,无论它放置在编辑器中的何处。
我已经查看了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\');
最合适的回答,由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;
}
对这两个函数都这样做,我希望这会起作用。如果我严重误读了某些内容,请道歉。