Поддержка Проблемы и решения Warning: foreach() argument must be of type array|object

  • После обновления до Php 8.0 WordPress начал ругаться на кастомный код в одном из файлов темы, который отображает теги таксономии в заголовке. Сам код рабочий, но на некоторых страницах с ним возникает ошибка прямо текстом на самой странице даже без включённого debug.

    Ошибка вот такая:
    WARNING: FOREACH() ARGUMENT MUST BE OF TYPE ARRAY|OBJECT, BOOL GIVEN IN /VAR/WWW/U0998617/DATA/WWW/STRATEGYCON.RU/WP-CONTENT/THEMES/HUEMAN-CHILD-2/PARTS/PAGE-TITLE.PHP ON LINE 28

    Сам код:

    <!--теги статуса начало-->
    <?php
    $post_type = get_post_type();
    if ($post_type == 'page') {
    	$terms = get_the_terms( get_the_ID(), 'status_of_game' );
    	$term_links = array();
    	foreach ( $terms as $term ) {
    		$term_links[] = '<a href="' . get_term_link( $term ) . '" class="status_of_game-' . $term->slug . '">' . $term->name . '</a>';
    	}
    	echo implode("/ ", $term_links );
    	}
    ?>
    <!--теги статуса конец-->

    Где 28 строка это
    foreach ( $terms as $term ) {

    Подскажите, пожалуйста, как поправить код, чтобы убрать предупреждение. Я сам в Php совсем не разбираюсь.

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Модератор Yuri

    (@yube)

    но на некоторых страницах с ним возникает ошибка

    Видимо, там, где нет подходящих термов и $terms имеет значение false.

    даже без включённого debug.

    У php может быть свое мнение (в смысле настроек) о том, что выводить.

    Как вариант:

    	$terms = get_the_terms( get_the_ID(), 'status_of_game' );
    	if ( ! empty($terms) ) {
    		$term_links = array();
    		foreach ( $terms as $term ) {
    			$term_links[] = '<a href="' . get_term_link( $term ) . '" class="status_of_game-' . $term->slug . '">' . $term->name . '</a>';
    		}
    		echo implode("/ ", $term_links );
    	}
    

    С кодом выше получаю другую ошибку:

    $TERMS = GET_THE_TERMS( GET_THE_ID(), ‘STATUS_OF_GAME’ ); IF ( ! EMPTY($TERMS) ) { $TERM_LINKS = ARRAY(); FOREACH ( $TERMS AS $TERM ) { $TERM_LINKS[] = » . $TERM->NAME . »; } ECHO IMPLODE(«/ «, $TERM_LINKS ); }

    Решение нашлось. Код ниже не выдаёт предупреждений:

    <!--теги статуса начало-->
    <?php
    $post_type = get_post_type();
    if ($post_type == 'page') {
    $terms = get_the_terms( get_the_ID(), 'status_of_game' );
    if($terms){
    $term_links = array();
    foreach ( $terms as $term ) {
    $term_links[] = '<a href="' . get_term_link( $term ) . '" class="status_of_game-' . $term->slug . '">' . $term->name . '</a>';
    }
    echo implode("/ ", $term_links );
    }
    }
    ?>
    <!--теги статуса конец-->
Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Тема «Warning: foreach() argument must be of type array|object» закрыта для новых ответов.