Обновление до php 7.1

У меня быстрый вопрос об обновлении моего файла темы до 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&hellip;', '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="&lt;i class='ps-icon-arrow-left'&gt;&lt;/i&gt;" data-owl-nav-right="&lt;i class='ps-icon-arrow-right'&gt;&lt;/i&gt;">

                <?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();

Спасибо за любую помощь, я очень ценю это!

Привет. Если это связано с wordpress, добавьте к своему вопросу тег wordpress.

ryantxr 13.09.2018 19:32

Я собираюсь предположить, что это может быть =& в вашем вызове setup_postdata. Не знаю, как это исправить, но, может быть, кроме $GLOBALS['post'] =& $post_object; setup_postdata($GLOBALS['post']);.

aynber 13.09.2018 19:37

Привет. Сообщение об ошибке, которое вы опубликовали, не похоже на стандартное сообщение об ошибке PHP. Это точный текст, полученный в результате выполнения этого кода? Или это результат работы инструмента, который вы запускаете для проверки совместимости кода?

IMSoP 13.09.2018 19:40

Лучшими дубликатами были бы stackoverflow.com/questions/8971261/… или stackoverflow.com/questions/4665782/…, но код в вопросе фактически не включает передачу по ссылке, поэтому мне интересно, является ли это инструментом проверки, выдающим неправильное сообщение.

IMSoP 13.09.2018 19:43
1
5
133
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этот символ & перед переменной $post_object, принудительно присваиваемой по ссылке.

Вам не нужно & при передаче аргументов функции. По умолчанию объекты передаются по ссылке в PHP5. Официальные документы WP говорят, что вы должны пройти рефренцию для глобальной переменной post. Вы можете выполнить оба требования следующим образом:

$GLOBALS['post'] =& $post_object;
setup_postdata($post_object);

нет проблем с присвоением по ссылке в этой позиции есть в любой версии PHP, и простое его удаление может вызвать проблемы в другом месте приложения.

IMSoP 13.09.2018 19:45

@IMSoP, хорошо, это действительно не лучший совет. Что вы думаете об этом сейчас?

Arek Kostrzeba 13.09.2018 21:17

Страница, на которую вы ссылаетесь, включает точная строка кода, предположительно вызывающая ошибку как Правильно способ использования этой функции, и я не знаю ни одной причины, по которой он не должен работать в PHP 7.1. Когда я комментировал вопрос, я думаю, что вся проблема на самом деле где-то в другом месте, и у нас нет полной истории того, откуда пришло это сообщение об ошибке. (Кстати, тоже неверно, что «объекты передаются по ссылке», хотя различие между указателем на объект и ссылкой является тонким.)

IMSoP 13.09.2018 21:47
Ответ принят как подходящий

setup_postdata( $GLOBALS['post'] =& $post_object ); выполняет задание по ссылке, что довольно странно.

В этой строке кода вы ссылаетесь на функцию WordPress setup_postdata, которая в основном незаметно заполняет кучу переменных, ориентированных на WP. Обычно вы просто вызываете это с помощью: setup_postdata($post_object), и все готово.

И не забудьте вызвать wp_reset_postdata(), когда цикл закрыт, что сбрасывает переменные для других циклов WP, которые вы можете запустить в другом месте на сайте.

Мой wordpress сказал, что при внесении изменений произошел сбой, но они застряли, и я смог обновить PHP. Спасибо!

Sage Suede 13.09.2018 21:28

Это может показаться странным, но не должно вызывать никаких ошибок, и фактически показан как пример в руководстве Wordpress.

IMSoP 13.09.2018 21:48

Другие вопросы по теме