Как вывести шорткод в верхней части содержимого?

Шорткод, создаваемый этой функцией — список всех сайтов в мультисайте — выводит над контентом в цикле, независимо от того, где он находится в редакторе.

Я посмотрел на другие связанные вопросы и ответы по WPSE и понял, что это связано с функцией, использующей echo вместо return, но это не так просто, как замена экземпляров echo на return в функции ниже. Или добавив echo=0 с помощью функции WP, такой как wp_list_pages()

Есть идеи?

// Вывести один пункт меню
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) != '/') {
          
            $url .= '/';
        }
        echo '<a href="' . $url . '">' . $title . '</a>';
        if ($id == $blog_id) {
            echo '</strong>';
        }
        echo '</li>';
    }
}

// Вывести все меню
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>';
}

// Создать шорткод [bloglist]

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

add_shortcode('bloglist', 'bloglist_shortcode');

Понравилась статья? Поделиться с друзьями:
WPAsk
Ответов: 2
  1. s_ha_dum

    Вам нужно создать строку и вернуть ее.

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

    Сделайте это для обеих функций.

  2. fuxia

    All functions have to return a string, you should not use echo anywhere. Rewrite the functions, use an internal variable to handle the strings and return that:

    Все функции должны возвращать строку командой return . Вы не должны нигде использовать echo . Перепишите функции, используйте внутреннюю переменную для обработки строк и верните следующее:

    
    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;
    }
    
    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;
    }
    
    function bloglist_shortcode($atts)
    {
        return projects_menu(false);
    }
    
    add_shortcode('bloglist', 'bloglist_shortcode');
    

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: