У меня быстрый вопрос об обновлении моего файла темы до PHP 7.1. Я знаю, что это легко сделать, но я не понимаю PHP.
В настоящее время он имеет старую совместимость с версией 5.3, и это единственная ошибка в двух частях моей темы: «ОШИБКА | Использование передачи по ссылке во время вызова устарело с PHP 5.3 и запрещено с PHP 5.4».
Я бы спросил своего разработчика темы, но в прошлый раз они что-то сделали, они удалили весь мой собственный код CSS. Очень ужасная поддержка с их стороны, и я не могу им больше доверять.
Обе проблемные строки используют этот код setup_postdata( $GLOBALS['post'] =& $post_object );
ТЕМАТИЧЕСКИЙ ФАЙЛ №1:
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( $upsells ) : ?>
<div class = "ps-section pb-50">
<div class = "ps-container">
<div class = "ps-section__header text-center">
<h2 class = "ps-section__title"><?php esc_html_e('You may also like…', 'xuper');?></h2>
</div>
<div class = "ps-section__content">
<div class = "ps-slider--center owl-slider products" data-owl-auto = "true" data-owl-loop = "true" data-owl-speed = "5000" data-owl-gap = "30" data-owl-nav = "true" data-owl-dots = "false" data-owl-item = "4" data-owl-item-xs = "1" data-owl-item-sm = "2" data-owl-item-md = "3" data-owl-item-lg = "4" data-owl-duration = "1000" data-owl-mousedrag = "on" data-owl-nav-left = "<i class='ps-icon-arrow-left'></i>" data-owl-nav-right = "<i class='ps-icon-arrow-right'></i>">
<?php foreach ( $upsells as $upsell ) : ?>
<?php
$post_object = get_post( $upsell->get_id() );
setup_postdata( $GLOBALS['post'] =& $post_object );
wc_get_template_part( 'content', 'product' ); ?>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
`
`
<?php
$post_object = get_post( $related_product->get_id() );
`setup_postdata( $GLOBALS['post'] =& $post_object );
wc_get_template_part( 'content', 'product' ); ?>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
wp_reset_postdata();
Спасибо за любую помощь, я очень ценю это!
Я собираюсь предположить, что это может быть =& в вашем вызове setup_postdata. Не знаю, как это исправить, но, может быть, кроме $GLOBALS['post'] =& $post_object; setup_postdata($GLOBALS['post']);.
Привет. Сообщение об ошибке, которое вы опубликовали, не похоже на стандартное сообщение об ошибке PHP. Это точный текст, полученный в результате выполнения этого кода? Или это результат работы инструмента, который вы запускаете для проверки совместимости кода?
Возможный дубликат Обходной путь для устаревания времени вызова по ссылке в PHP?
Лучшими дубликатами были бы stackoverflow.com/questions/8971261/… или stackoverflow.com/questions/4665782/…, но код в вопросе фактически не включает передачу по ссылке, поэтому мне интересно, является ли это инструментом проверки, выдающим неправильное сообщение.






Этот символ & перед переменной $post_object, принудительно присваиваемой по ссылке.
Вам не нужно & при передаче аргументов функции. По умолчанию объекты передаются по ссылке в PHP5. Официальные документы WP говорят, что вы должны пройти рефренцию для глобальной переменной post. Вы можете выполнить оба требования следующим образом:
$GLOBALS['post'] =& $post_object;
setup_postdata($post_object);
нет проблем с присвоением по ссылке в этой позиции есть в любой версии PHP, и простое его удаление может вызвать проблемы в другом месте приложения.
@IMSoP, хорошо, это действительно не лучший совет. Что вы думаете об этом сейчас?
Страница, на которую вы ссылаетесь, включает точная строка кода, предположительно вызывающая ошибку как Правильно способ использования этой функции, и я не знаю ни одной причины, по которой он не должен работать в PHP 7.1. Когда я комментировал вопрос, я думаю, что вся проблема на самом деле где-то в другом месте, и у нас нет полной истории того, откуда пришло это сообщение об ошибке. (Кстати, тоже неверно, что «объекты передаются по ссылке», хотя различие между указателем на объект и ссылкой является тонким.)
setup_postdata( $GLOBALS['post'] =& $post_object ); выполняет задание по ссылке, что довольно странно.
В этой строке кода вы ссылаетесь на функцию WordPress setup_postdata, которая в основном незаметно заполняет кучу переменных, ориентированных на WP. Обычно вы просто вызываете это с помощью: setup_postdata($post_object), и все готово.
И не забудьте вызвать wp_reset_postdata(), когда цикл закрыт, что сбрасывает переменные для других циклов WP, которые вы можете запустить в другом месте на сайте.
Мой wordpress сказал, что при внесении изменений произошел сбой, но они застряли, и я смог обновить PHP. Спасибо!
Это может показаться странным, но не должно вызывать никаких ошибок, и фактически показан как пример в руководстве Wordpress.
Привет. Если это связано с wordpress, добавьте к своему вопросу тег wordpress.