Đầu ra shortcode ở đầu the_content


7

Mã ngắn được tạo bởi chức năng này - một danh sách tất cả các trang web trong nhiều trang - xuất ra phía trên nội dung trong vòng lặp, bất kể nó được đặt ở đâu trong trình chỉnh sửa.

Tôi đã xem xét các câu hỏi và câu trả lời liên quan khác trên WPSE và nhận ra rằng nó phải thực hiện với chức năng sử dụng echothay vì return, nhưng không dễ dàng như thay thế các trường hợp echobằng returntrong hàm bên dưới. Hoặc thêm echo=0bằng chức năng WP nhưwp_list_pages()

Có ý kiến ​​gì không? Đâu là chức năng cần được trả về thay vì lặp lại?

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

Câu trả lời:


10

Tất cả các chức năng phải trả về một chuỗi, bạn không nên sử dụng echobất cứ nơi nào. Viết lại các hàm, sử dụng một biến nội bộ để xử lý các chuỗi và trả về:

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

Đối với một ví dụ tương tự, mở rộng, xem: Cách trả về nội dung vòng lặp .


À, bạn nói đúng; Điều đó có ý nghĩa. Tốt công việc xung quanh. Cảm ơn.
markratledge

5

Bạn không thể thay thế các trường hợp echovì bạn chỉ có thể quay lại một lần. Bạn cần xây dựng một chuỗi và trả về đó.

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

Làm điều đó cho cả hai chức năng và tôi mong muốn nó hoạt động. Xin lỗi nếu tôi đã đọc sai một cái gì đó.


Cảm ơn, và bạn đã đúng. toscho đánh bạn hai phút.
markratledge

2

Có ý kiến ​​gì không? Đâu là chức năng cần được trả về thay vì lặp lại?

Tôi sẽ cung cấp một giải pháp thay thế không yêu cầu bạn thay thế các trường hợp của tiếng vang hoặc xây dựng chuỗi trả về.

Bạn có thể bật bộ đệm đầu ra và trả về bộ đệm dưới dạng chuỗi.

Thêm ob_start()vào đầu hàm trước bất kỳ lệnh gọi echo nào.

ở cuối hàm thêm:

$response = ob_get_contents();
ob_end_clean();
return $response;

Phương pháp này hoạt động rất tốt; Cuối cùng tôi đã có được xung quanh để thử nó. Cảm ơn.
markratledge

0

Câu trả lời ngắn gọn và nhanh chóng:

Bạn nên returnđầu ra của bạn và không echonó.

$output = 'first';
$output .= 'second'; //notice the dot (.=) after the first variable
$output .= 'third';
return $output;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.