Ошибка при переходе на php8 WordPress, Как исправить?
Сайт тестовый! Сначала собирал на Опенсервере и там уже стоял 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 и все сразу заработало
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В вашем случае ошибка после перехода на PHP 8 связана не с
mysqli, Swiper или сервером, а с короткими PHP-тегами<?. На одном сервереshort_open_tagможет быть включён, на другом выключен. Когда он выключен, PHP не воспринимает<?как начало PHP-кода, и дальше разметка сelse/endifначинает ломать синтаксис.Правильное решение — заменить все короткие теги на полные:
<?php if ( $images ) : ?> ... <?php else : ?> ... <?php endif; ?>
А не так:
<? if ( $images ) : ?> ... <? else: ?> ... <? endif; ?>
Включать
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' ) : ''; ?> <div class="swiper offer-slider"> ... </div> <?php else : ?> <?php the_post_thumbnail( 'medium', [ 'class' => 'offer-single__thumbnail' ] ); ?> <?php endif; ?>
Что проверить по проекту перед переходом на PHP 8:
<?и замена на<?php, кроме<?=;Если проект старый, лучше прогнать хотя бы
php -lпо файлам темы и включитьWP_DEBUG_LOGна тестовой копии.