Пользовательские виджеты WordPress отображаются в неправильном положении

#php #wordpress #wordpress-shortcode

#php #wordpress #wordpress-короткий код

Вопрос:

Я хочу отобразить виджет контактов в моей пользовательской теме WordPress, поэтому я поместил его в короткий код, чтобы я мог вызывать его в любое время и в любом месте. Проблема в том, что шорткод отображается поверх оригинала, в который я поместил шорткод. Это происходит с виджетами, обычными текстовыми полями и т. Д.

Сначала я добавил строку add_filter( 'widget_text', 'do_shortcode' ); , чтобы включить поля для отображения коротких кодов.

В моем functions.php Я поместил следующий код, в котором я вызываю часть шаблона с контактной информацией. Я видел другую тему, в которой они решили проблему, введя return переменную.

     // contact widget
function contact_info_shortcode() { 
    
    $contact = get_template_part('includes/sections/contact', 'info');
    
    return $contact;

    } 
add_shortcode('contact_info', 'contact_info_shortcode'); 
 

В этом коде я вызываю следующий файл шаблона, который показывает мою контактную информацию

     <?php

    $contact_title = get_field('contact-titel', 'option');
    $phone = get_field('telefoon', 'option');
    $email = get_field('e-mail', 'option');
    $adress = get_field('adres', 'option');
    $place = get_field('plaats', 'option');
;?>
 
 <table class="contact-table">

    <!-- telefoon -->
    <tr>
        <td><i class="fas fa-phone"></i></td>
        <td><a class="contact-info-link" href="<?php echo $phone['url'];?>" target="<?php echo $phone['target'];?>"><?php echo $phone['title'];?></a></td>
    </tr>

    <!-- email -->
    <tr>
        <td><i class="fas fa-envelope"></i></td>
        <td><a class="contact-info-link" href="<?php echo $email['url'];?>" target="<?php echo $email['target'];?>"><?php echo $email['title'];?></a></td>
    </tr>

    <!-- adres -->
    <tr>
        <td><i class="fas fa-map-marker-alt"></i></td>
        <td>
            <p class="contact-info-adress"><?php echo $adress;?></p>
            <p class="contact-info-adress"><?php echo $place;?></p>
        </td>
    </tr>

</table>
 

Надеюсь, вы, ребята, знаете, что я делаю неправильно

Ответ №1:

Это потому get_template_part() , что на самом деле это просто оболочка для include, которая по сути echoing является частью шаблона, поэтому вы не можете присвоить ее переменной.

Что вам нужно сделать, это сохранить часть шаблона в output buffer , а затем вернуть выходной буфер.

 function contact_info_shortcode() { 
    // Here we start the output buffer.
    ob_start();
    // This is now held in the output buffer.
    get_template_part('includes/sections/contact', 'info');
    // Now we can return the data in the output buffer.
    return ob_get_clean();
} 
add_shortcode('contact_info', 'contact_info_shortcode');
 

Комментарии:

1. Отлично! Решена моя проблема!

2. @RicardiodePenning если это решит проблему, пожалуйста, проголосуйте и отметьте этот ответ как принятый.