Shortcode-Ausgaben oben im Inhalt

7

Der von dieser Funktion erzeugte Shortcode - eine Liste aller Sites in einer Multisite - wird über dem Inhalt der Schleife ausgegeben, unabhängig davon, wo er im Editor abgelegt wird.

Ich habe bei den anderen damit verbundenen Fragen und Antworten auf WPSE sehe und erkennen , dass es mit der Funktion zu tun hat , mit echostatt return, aber es ist nicht so einfach wie die Instanzen zu ersetzen , echomit returnder der Funktion unten. Oder echo=0mit einer WP-Funktion wie hinzufügenwp_list_pages()

Irgendwelche Ideen? Wo ist die Funktion, die zurückgegeben werden muss, anstatt wiedergegeben zu werden?

// 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');
markratledge
quelle
Mögliches Duplikat des Shortcodes wird immer oben auf der Seite angezeigt
Michael,

Antworten:

10

Alle Funktionen müssen zurückgeben eine Zeichenfolge, sollten Sie nicht verwenden , an echojedem Ort. Schreiben Sie die Funktionen neu, verwenden Sie eine interne Variable, um die Zeichenfolgen zu verarbeiten, und geben Sie Folgendes zurück:

// 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');

Ein ähnliches, erweitertes Beispiel finden Sie unter: Zurückgeben von Schleifeninhalten .

Fuxia
quelle
Ah, du hast recht; Das macht Sinn. Gute Arbeit herum. Vielen Dank.
Markratledge
5

Sie können die Instanzen von nicht ersetzen, echoda Sie nur einmal zurückkehren können. Sie müssen eine Zeichenfolge erstellen und diese zurückgeben.

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;
}

Tun Sie das für beide Funktionen und ich würde erwarten, dass dies funktioniert. Entschuldigung, wenn ich etwas grob falsch verstanden habe.

s_ha_dum
quelle
Danke und du hast recht. toscho hat dich um zwei Minuten geschlagen.
Markratledge
2

Irgendwelche Ideen? Wo ist die Funktion, die zurückgegeben werden muss, anstatt wiedergegeben zu werden?

Ich werde eine alternative Lösung anbieten, bei der Sie keine Echoinstanzen ersetzen oder eine Rückgabezeichenfolge erstellen müssen.

Sie können die Ausgabepufferung aktivieren und den Puffer als Zeichenfolge zurückgeben.

Fügen Sie ob_start()vor jedem Echoaufruf den Anfang der Funktion hinzu.

am Ende der Funktion hinzufügen:

$response = ob_get_contents();
ob_end_clean();
return $response;
Chris_O
quelle
Diese Methode funktioniert hervorragend. Ich habe es endlich versucht. Vielen Dank.
Markratledge
0

Kurze und schnelle Antwort:

Sie sollten returnIhre Ausgabe und nicht echoes.

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