Lo shortcode viene visualizzato in cima al contenuto the_content
Lo shortcode generato da questa funzione - una lista di tutti i siti in un multisito - viene visualizzato sopra il contenuto nel loop, indipendentemente da dove viene posizionato nell'editor.
Ho esaminato le altre domande e risposte correlate su WPSE e ho capito che dipende dal fatto che la funzione utilizza echo
invece di return
, ma non è semplice come sostituire le istanze di echo
con return
nella funzione seguente. O aggiungere echo=0
con una funzione WP come wp_list_pages()
.
Qualche idea? Qual è la funzione che deve restituire il valore invece di visualizzarlo direttamente?
// Visualizza una singola voce del menu
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) != '/') {
// Nota: ho aggiunto "/" alla fine dell'URL perché WordPress
// non lo faceva automaticamente nella versione 3.0.4
$url .= '/';
}
echo '<a href="' . $url . '">' . $title . '</a>';
if ($id == $blog_id) {
echo '</strong>';
}
echo '</li>';
}
}
// Visualizza l'intero menu
// Se $link_self è false, salta il sito corrente - usato per visualizzare il menu nella 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>';
}
// Aggiunge uno shortcode [bloglist]
function bloglist_shortcode($atts)
{
projects_menu(false);
}
add_shortcode('bloglist', 'bloglist_shortcode');

Tutte le funzioni devono restituire una stringa, non dovresti usare echo
da nessuna parte. Riscrivi le funzioni, utilizza una variabile interna per gestire le stringhe e restituiscila:
// Output di una singola voce del menu
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 dell'intero menu
// Se $link_self è false, salta il sito corrente - utilizzato per visualizzare il menu nella 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;
}
// Aggiunge uno shortcode [bloglist]
function bloglist_shortcode($atts)
{
return projects_menu(false);
}
add_shortcode('bloglist', 'bloglist_shortcode');
Per un esempio simile ma esteso vedi: Come restituire i contenuti del loop.

Non puoi sostituire le istanze di echo
perché puoi restituire solo una volta. Devi costruire una stringa e restituirla.
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>';
}
// e così via
$ret .= '</ul>';
return $ret;
}
Fallo per entrambe le funzioni e mi aspetto che funzioni. Scusa se ho frainteso qualcosa.

Qualche idea? Dov'è la funzione che deve essere restituita invece di essere stampata con echo?
Ti propongo una soluzione alternativa che non richiede di sostituire le istanze di echo o costruire una stringa da restituire.
Puoi attivare il buffering dell'output e restituire il buffer come stringa.
Aggiungi ob_start()
all'inizio della funzione prima di qualsiasi chiamata echo.
Alla fine della funzione aggiungi:
$response = ob_get_contents();
ob_end_clean();
return $response;
