Содержание страницы WordPress, вставляемое внутри шорткода случайным образом - PullRequest
0 голосов
/ 18 октября 2018

Я пишу плагин, в котором вы вводите шорткод на страницу, и он отображает таблицу данных.

Однако содержимое страницы перед шорткодом случайным образом вставляется в середину таблицы.Когда я обновляю страницу, содержимое, введенное над шорткодом, случайным образом перемещается в таблицу, созданную шорткодом.

Содержимое под шорткодом не отображается в возвращении шорткода.

Кто-нибудь знает, почему это может происходить?Это супер странно.

------------------ Редактирование страницы WordPress ---------------

Вотнекоторый контент.

Вот еще один абзац.

[view_contributions]

Конец содержимого страницы.

------------------ конец редактирования wordpress ----------------------------

Затем выдает

------ дисплеи --------

[Таблица данных шорткода с надписью «Вот немного контента. Вот еще один абзац».случайно вставлен где-то в ячейку.Тогда еще таблица данных]

Конец содержимого страницы.

-------- конец экрана -----

Это так странно.Это как если бы шорткод рендерится первым, но затем WordPress вставляет содержимое страницы во что бы то ни было шорткодом.Есть идеи, что может вызвать это?

РЕДАКТИРОВАТЬ: Добавлен весь код в случае, если происходит что-то действительно странное ...

function soco_view_contributions_shortcode() { 
$view_contributions = Soco_Contributions::soco_display_contributions();
return $view_contributions;
}
add_shortcode( 'view_contributions', 'soco_view_contributions_shortcode');


    public function soco_display_contributions() {
    $contribution_results = Soco_Contributions::soco_get_contributions_view();

    ob_start;
?>      
<div name="div-output-container"> 

    <form name="frm-search-contributions">
        <table width="100%" border="0">
          <tbody>
            <tr>
              <th scope="col">Start Date</th>
              <th scope="col">End Date</th>
              <th scope="col">Minimum</th>
              <th scope="col">Maximum</th>
              <th scope="col">Name</th>
              <th scope="col">Event</th>
            </tr>
            <tr>
              <td><input type="date" name="start-date"></td>
              <td><input name="end-date" type="date" ></td>
              <td><input type="number" name="low-number"></td>
              <td><input type="number" name="high-number"></td>
              <td><text name="txt-auto-name">&nbsp;</textarea></td>
              <td><select>&nbsp;</select></td>
            </tr>
          </tbody>
        </table>
        <input type="submit">
        <input type="reset">
    </form>

    <table width="100%" border="0">
      <tbody>
        <tr>
          <th scope="col">Date</th>
          <th scope="col">Amount</th>
          <th scope="col">Cycle</th>
          <th scope="col">Name</th>
          <th scope="col">Event</th>
        </tr>

<?php   foreach ($contribution_results as $cr) {  ?>
            <tr>
              <td><?php echo $cr->contribution_date ?></td>
              <td><?php echo $cr->amount ?></td>
              <td><?php echo $cr->cycle_amount ?></td>
              <td><?php echo $cr->last_name.', '.$cr->first_name ?></td>
              <td>&nbsp;</td>
            </tr>

<?php   }  ?>

        </tbody>
    </table>

    <button name="btnDownload" id="btnDownload" title="Click this button to download the above dataset." >Download CSV File</button>

</div>
<?php   
        $contribution_output = ob_get_clean();

        return $contribution_output;
    }

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Проблема оказалась в смешивании ECHO и RETURN в выходном буфере.Чтобы исправить это, я превратил все это в сцепленную строку для вывода.

Я думаю, что эхо в цикле foreach испортило выходной буфер.Поэтому я удалил ob_start все вместе и просто выведу окончательную строку HTML.

Не очень хорошее решение, но, по крайней мере, оно работает сейчас и не дает случайных результатов.Если у кого-то есть предложения или примеры того, как смешать ob_start с логикой php внутри него, это было бы замечательно.Мне кажется странным, что ob_start () имеет проблемы с этим.

$contribution_output = '<div name="div-output-container"> 

    <form name="frm-search-contributions">
        <table width="100%" border="0">
          <tbody>
            <tr>
              <th scope="col">Start Date</th>
              <th scope="col">End Date</th>
              <th scope="col">Minimum</th>
              <th scope="col">Maximum</th>
              <th scope="col">Name</th>
              <th scope="col">Event</th>
            </tr>
            <tr>
              <td><input type="date" name="start-date"></td>
              <td><input name="end-date" type="date" ></td>
              <td><input type="number" name="min-amount"></td>
              <td><input type="number" name="max-amount"></td>
              <td>
                  <input type="text" name="donor_name">
                  <input type="hidden" name="hdn-donor-id" value="">
                </td>
              <td><select>&nbsp;</select></td>
            </tr>
          </tbody>
        </table>
        <input type="submit">
        <input type="reset">
    </form>

    <div name="contribution-results-container" >
        <table width="100%" border="0">
          <tbody>
            <tr>
              <th scope="col">Date</th>
              <th scope="col">Amount</th>
              <th scope="col">Cycle</th>
              <th scope="col">Name</th>
              <th scope="col">Event</th>
            </tr>';

    foreach ($contribution_results as $cr) {  
        $contribution_output .= '
            <tr>
              <td>'.$cr->contribution_date.'</td>
              <td>'.$cr->amount.'</td>
              <td>'.$cr->cycle_amount.'</td>
              <td>'.$cr->last_name.', '.$cr->first_name.'</td>
              <td>&nbsp;</td>
            </tr>';

    }  

    $contribution_output .= '</tbody>
        </table>

        <button name="btnDownload" id="btnDownload" title="Click this button to download the above dataset." >Download CSV File</button>
    </div>
</div>';
0 голосов
/ 19 октября 2018

Кажется, вы пытаетесь вернуть выходной буфер в виде строки.Когда вызывается ob_start (), все выходные данные подавляются до тех пор, пока ob_end (), ob_end_flush () или ob_end_clean () не будут вызваны так логически, что вы не сможете его вернуть.Просто вызовите их внутри самой функции и верните содержимое буфера вывода ( ob_get_contents () ) в виде строки:

add_shortcode('view_contributions','soco_view_contributions_shortcode');
function soco_view_contributions_shortcode( ) {
  ob_start();
  ?>
  <h1>Shortcode Output</h1>
  <p><?php echo "Some other output" ?></p>
  <?
  return ob_end_clean();
} 

Почему PHP этого не делаетбросить фатальную ошибку при попытке вернуть весь буфер из функции меня удивляет.

...