Ошибка при переходе на php8 WordPress, Как исправить?

Ссылка скопирована
1 ответ

Сайт тестовый! Сначала собирал на Опенсервере и там уже стоял PHP8.1
Все хорошо работало.
Закинул на сервер и там получил белое полотно с ошибкой.
Подключил PHP7.4 все норм работает,
Поставил плагин Query Monitor чтоб смотреть ошибки
Включил дебаг в конфиге.
Подключил опять PHP8.1
Проверил mysqli -включен (многие на него жалуются)
выдало
Fatal error: Uncaught Error: syntax error, unexpected token "else"
in /home/ashtest/public_html/wp-content/themes/ash-panel-wp/files/inc/ash-catalog/front/offer-slider.php on line 102

Call stack:

require_once()
wp-content/themes/ash-panel-wp/functions.php:36
include()
wp-settings.php:591
require_once()
wp-config.php:90
require_once()
wp-load.php:50
require_once()
wp-blog-header.php:13
require()
index.php:17
Query Monitor

Посмотрел сам файл ffer-slider.php
там ничего такого нет, прилаживаю на всякий случай, простой if else с перебором нутри картинок для слайдера

<?php  function ash_offer_slider() {   ?>   <?php   $images = get_field('offer_gallery')??'';    ?>   <?   if ($images): ?>      <?     if (get_field('check_video')):       $img = wp_get_attachment_image_url(get_field('video_preview'), 'medium')??'';        ?>      <?     endif; ?>     <div class="swiper offer-slider">        <div class="swiper-wrapper">         <div class="swiper-slide offer-slider__item">           <?           the_post_thumbnail('medium') ?>         </div>         <?php         foreach ($images as $image): ?>           <div class="swiper-slide offer-slider__item">             <img src="<?php             echo esc_url($image['url']); ?>" alt="<?php             echo esc_attr($image['alt']); ?>" loading="lazy"/>           </div>           <?           if (get_field('check_video')): ?>             <div class="swiper-slide offer-slider__item offer-slider__item-video ">              <span class="button-video open_modal" rel="offer_video">               <svg x="0" y="0" viewBox="0 0 152 152" style="enable-background:new 0 0 512 512"                    xml:space="preserve" class=""><g><g data-name="Layer 2"><g data-name="02.YouTube"><path                           fill="#ffffff"                           d="M100.87 47.41H51.13A15.13 15.13 0 0 0 36 62.55v26.9a15.13 15.13 0 0 0 15.13 15.14h49.74A15.13 15.13 0 0 0 116 89.45v-26.9a15.13 15.13 0 0 0-15.13-15.14zM65.46 88.26V63.74L86.54 76z"                           data-original="#ffffff" class=""></path></g></g></g></svg>             </span>               <img src="<?= $img ?>" alt="video" loading="lazy" height="80">             </div>            <?           endif; ?>         <?php         endforeach; ?>        </div>       <div class="post-navigation">          <span class="post-navigation__prev">             <svg x="0" y="0"                  viewBox="0 0 240.823 240.823" style="enable-background:new 0 0 512 512" xml:space="preserve"><g><path                     d="M57.633 129.007 165.93 237.268c4.752 4.74 12.451 4.74 17.215 0 4.752-4.74 4.752-12.439 0-17.179l-99.707-99.671 99.695-99.671c4.752-4.74 4.752-12.439 0-17.191-4.752-4.74-12.463-4.74-17.215 0L57.621 111.816c-4.679 4.691-4.679 12.511.012 17.191z"                 ></path></g></svg>          </span>         <span class="post-navigation__next">      <svg x="0" y="0"           viewBox="0 0 240.823 240.823" style="enable-background:new 0 0 512 512" xml:space="preserve"><g><path              d="M183.189 111.816 74.892 3.555c-4.752-4.74-12.451-4.74-17.215 0-4.752 4.74-4.752 12.439 0 17.179l99.707 99.671-99.695 99.671c-4.752 4.74-4.752 12.439 0 17.191 4.752 4.74 12.463 4.74 17.215 0l108.297-108.261c4.68-4.691 4.68-12.511-.012-17.19z"          ></path></g></svg>     </span>       </div>      </div>     <div class="swiper offer-slider__nav">       <div class="swiper-wrapper">         <?         the_post_thumbnail('thumbnail') ?>          <?php         foreach ($images as $image): ?>           <div class="swiper-slide offer-slider__nav-item">             <img src="<?php             echo esc_url($image['sizes']['thumbnail']); ?>" alt="<?php             echo esc_attr($image['alt']); ?>" loading="lazy"/>           </div>         <?php         endforeach; ?>         <?         if (get_field('check_video')): ?>           <div class="swiper-slide offer-slider__nav-item offer-slider__nav-video ">              <span class="button-video open_video" rel="offer_video">               <svg x="0" y="0" viewBox="0 0 152 152" style="enable-background:new 0 0 512 512"                    xml:space="preserve" class=""><g><g data-name="Layer 2"><g data-name="02.YouTube"><path                           fill="#ffffff"                           d="M100.87 47.41H51.13A15.13 15.13 0 0 0 36 62.55v26.9a15.13 15.13 0 0 0 15.13 15.14h49.74A15.13 15.13 0 0 0 116 89.45v-26.9a15.13 15.13 0 0 0-15.13-15.14zM65.46 88.26V63.74L86.54 76z"                           data-original="#ffffff" class=""></path></g></g></g></svg>             </span>             <img src="<?= $img ?>" alt="video" loading="lazy">           </div>         <?         endif; ?>        </div>     </div>   <?php   else: ?>     <?php     the_post_thumbnail('medium', array('class' => 'offer-single__thumbnail')) ?>   <?php   endif; }

<?php function ash_offer_slider() { ?> <?php $images = get_field('offer_gallery')??''; ?> <? if ($images): ?> <? if (get_field('check_video')): $img = wp_get_attachment_image_url(get_field('video_preview'), 'medium')??''; ?> <? endif; ?> <div class="swiper offer-slider"> <div class="swiper-wrapper"> <div class="swiper-slide offer-slider__item"> <? the_post_thumbnail('medium') ?> </div> <?php foreach ($images as $image): ?> <div class="swiper-slide offer-slider__item"> <img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>" loading="lazy"/> </div> <? if (get_field('check_video')): ?> <div class="swiper-slide offer-slider__item offer-slider__item-video "> <span class="button-video open_modal" rel="offer_video"> <svg x="0" y="0" viewBox="0 0 152 152" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><g data-name="Layer 2"><g data-name="02.YouTube"><path fill="#ffffff" d="M100.87 47.41H51.13A15.13 15.13 0 0 0 36 62.55v26.9a15.13 15.13 0 0 0 15.13 15.14h49.74A15.13 15.13 0 0 0 116 89.45v-26.9a15.13 15.13 0 0 0-15.13-15.14zM65.46 88.26V63.74L86.54 76z" data-original="#ffffff" class=""></path></g></g></g></svg> </span> <img src="<?= $img ?>" alt="video" loading="lazy" height="80"> </div> <? endif; ?> <?php endforeach; ?> </div> <div class="post-navigation"> <span class="post-navigation__prev"> <svg x="0" y="0" viewBox="0 0 240.823 240.823" style="enable-background:new 0 0 512 512" xml:space="preserve"><g><path d="M57.633 129.007 165.93 237.268c4.752 4.74 12.451 4.74 17.215 0 4.752-4.74 4.752-12.439 0-17.179l-99.707-99.671 99.695-99.671c4.752-4.74 4.752-12.439 0-17.191-4.752-4.74-12.463-4.74-17.215 0L57.621 111.816c-4.679 4.691-4.679 12.511.012 17.191z" ></path></g></svg> </span> <span class="post-navigation__next"> <svg x="0" y="0" viewBox="0 0 240.823 240.823" style="enable-background:new 0 0 512 512" xml:space="preserve"><g><path d="M183.189 111.816 74.892 3.555c-4.752-4.74-12.451-4.74-17.215 0-4.752 4.74-4.752 12.439 0 17.179l99.707 99.671-99.695 99.671c-4.752 4.74-4.752 12.439 0 17.191 4.752 4.74 12.463 4.74 17.215 0l108.297-108.261c4.68-4.691 4.68-12.511-.012-17.19z" ></path></g></svg> </span> </div> </div> <div class="swiper offer-slider__nav"> <div class="swiper-wrapper"> <? the_post_thumbnail('thumbnail') ?> <?php foreach ($images as $image): ?> <div class="swiper-slide offer-slider__nav-item"> <img src="<?php echo esc_url($image['sizes']['thumbnail']); ?>" alt="<?php echo esc_attr($image['alt']); ?>" loading="lazy"/> </div> <?php endforeach; ?> <? if (get_field('check_video')): ?> <div class="swiper-slide offer-slider__nav-item offer-slider__nav-video "> <span class="button-video open_video" rel="offer_video"> <svg x="0" y="0" viewBox="0 0 152 152" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><g data-name="Layer 2"><g data-name="02.YouTube"><path fill="#ffffff" d="M100.87 47.41H51.13A15.13 15.13 0 0 0 36 62.55v26.9a15.13 15.13 0 0 0 15.13 15.14h49.74A15.13 15.13 0 0 0 116 89.45v-26.9a15.13 15.13 0 0 0-15.13-15.14zM65.46 88.26V63.74L86.54 76z" data-original="#ffffff" class=""></path></g></g></g></svg> </span> <img src="<?= $img ?>" alt="video" loading="lazy"> </div> <? endif; ?> </div> </div> <?php else: ?> <?php the_post_thumbnail('medium', array('class' => 'offer-single__thumbnail')) ?> <?php endif; }

На всякий случай вот php.ini https://ashtest.pp.ua/ini.php
Я думаю что что то не включено на сервере т.к. на Опенсервере все работало
Есть у кого то какие предложения?

Дополнительно:

short_open_tag

Это из разряда ошибок, где php не может корректно сообщить о проблеме и нужно изучать сам код.

  • Вообще-то это из разряда ошибок, которые стоит проверить прежде, чем смотреть еще куда бы то ни было.
    И никакого смысла изучать код для этой конкретной ошибки, кроме возможности хлопнуть себя по лбу с воплем "вот я телятина!", тут нет ;)
  • Adamos, хотите сказать, что проблема не в том, что я предложил для решения?
  • maksam07, в том, конечно.
    Просто это очевиднейший косяк, вечный №1 в топе того, почему у чайника на новом сервере "а на Опенсервере работало".
  • Adamos, мне тут особо нечего сказать, у всех могут быть разные случаи, почему они не могут найти эту ошибку. Мне так недавно сис.админ с небольшим опытом по пхп написал, говорит, провозился всю ночь с сайтом, а где проблема - не может найти. Кто-то о таком теге возможно особо и не слышал, а его использование встречается
  • maksam07, это именно нехватка опыта. Короткие теги по умолчанию всегда отключены, и любой, кто сам натягивал на новый сайт сколько-нибудь старый код, с этими граблями сталкивался.
  • Adamos, да, конечно, согласен. Поэтому люди все никак и не закончат спрашивать о таких ошибках)

Напишу на всякий случай может кому-то пригодится.
Все оказалось проще чем обычно!)
На этом сервере в 8 версии не поддерживается краткое <?
нужно писать полностью <?php

  • Почему не поддерживается? Даже если конфиг правишь, сервер тебе говорит - не-не, так не пойдет?
  • php ini short_open_tag = Off
    Переключил на on и все сразу заработало
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

В вашем случае ошибка после перехода на PHP 8 связана не с mysqli, Swiper или сервером, а с короткими PHP-тегами <?. На одном сервере short_open_tag может быть включён, на другом выключен. Когда он выключен, PHP не воспринимает <? как начало PHP-кода, и дальше разметка с else/endif начинает ломать синтаксис.

Правильное решение — заменить все короткие теги на полные:

&lt;?php if ( $images ) : ?&gt;
    ...
&lt;?php else : ?&gt;
    ...
&lt;?php endif; ?&gt;

&lt;?php if ( $images ) : ?&gt; ... &lt;?php else : ?&gt; ... &lt;?php endif; ?&gt;

А не так:

&lt;? if ( $images ) : ?&gt;
    ...
&lt;? else: ?&gt;
    ...
&lt;? endif; ?&gt;

&lt;? if ( $images ) : ?&gt; ... &lt;? else: ?&gt; ... &lt;? endif; ?&gt;

Включать short_open_tag = On можно как временный обход, но это плохая зависимость от настроек сервера. При следующем переносе, обновлении PHP-FPM или смене хостинга проблема вернётся.

Дополнительно в вашем фрагменте стоит привести код к более устойчивому виду:

$images = get_field( 'offer_gallery' );
 
if ( $images ) :
    $has_video = (bool) get_field( 'check_video' );
    $img       = $has_video ? wp_get_attachment_image_url( get_field( 'video_preview' ), 'medium' ) : '';
    ?&gt;
    &lt;div class="swiper offer-slider"&gt;
        ...
    &lt;/div&gt;
&lt;?php else : ?&gt;
    &lt;?php the_post_thumbnail( 'medium', [ 'class' =&gt; 'offer-single__thumbnail' ] ); ?&gt;
&lt;?php endif; ?&gt;

$images = get_field( 'offer_gallery' ); if ( $images ) : $has_video = (bool) get_field( 'check_video' ); $img = $has_video ? wp_get_attachment_image_url( get_field( 'video_preview' ), 'medium' ) : ''; ?&gt; &lt;div class="swiper offer-slider"&gt; ... &lt;/div&gt; &lt;?php else : ?&gt; &lt;?php the_post_thumbnail( 'medium', [ 'class' =&gt; 'offer-single__thumbnail' ] ); ?&gt; &lt;?php endif; ?&gt;

Что проверить по проекту перед переходом на PHP 8:

  • поиск по теме: <? и замена на <?php, кроме <?=;
  • PHP error log после включения PHP 8;
  • совместимость плагинов и темы;
  • устаревшие конструкции, которые в PHP 8 стали fatal error.

Если проект старый, лучше прогнать хотя бы php -l по файлам темы и включить WP_DEBUG_LOG на тестовой копии.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно