Lo shortcode viene visualizzato in cima al contenuto the_content

19 nov 2012, 00:05:59
Visualizzazioni: 2.62K
Voti: 7

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');
1
Commenti

possibile duplicato di Shortcode che viene sempre visualizzato in cima alla pagina

Michael Michael
19 nov 2012 00:20:57
Tutte le risposte alla domanda 4
1
10

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.

19 nov 2012 00:16:00
Commenti

Ah, hai ragione; ha senso. Bella soluzione. Grazie.

markratledge markratledge
19 nov 2012 00:20:03
1

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.

19 nov 2012 00:18:01
Commenti

Grazie, e hai ragione. toscho ti ha preceduto di due minuti.

markratledge markratledge
19 nov 2012 00:20:43
1

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;
19 nov 2012 00:23:22
Commenti

Questo metodo funziona benissimo; alla fine ho trovato il tempo di provarlo. Grazie.

markratledge markratledge
29 ago 2013 07:18:20
0

Risposta breve e veloce:

Dovresti usare return per restituire l'output anziché echo.

$output = 'primo';
$output .= 'secondo'; //nota il punto (.=) dopo la prima variabile
$output .= 'terzo';
return $output;
10 mar 2019 16:39:36