WordPress插件因PHP7升级而损坏

时间:2018-04-04 05:38:09

标签: php wordpress php-7

我刚刚维护的另一位开发人员刚刚建立的网站已经破产。我已经浏览了错误日志,这就是我所看到的:

[04-Apr-2018 05:30:47 UTC] PHP Warning:  count(): Parameter must be an array or an object that implements Countable in /.../.../.../.../plugins/taxonomy-order/taxonomy-order.php on line 280

现在你可能在想......为什么我不更新插件。我希望,插件不再包含在WordPress中,开发者已经删除了他/她的帐户,并且没有支持选项。所以我现在正在努力解决这个问题。

我找到了引起问题的代码:

if( count( $taxonomies === 1 ) ) $taxonomy = array_shift( $taxonomies );

尝试在这里提供更多的上下文是整个函数:

public function terms_clauses( $clauses, $taxonomies, $args ) {
    global $wpdb;

    $taxonomies = (array) $taxonomies;

    if( count( $taxonomies === 1 ) ) $taxonomy = array_shift( $taxonomies );
    else return $clauses;

    if( !$this->has_taxonomy_support($taxonomy) ) return $clauses;

    // Fields
    if ( strpos( 'COUNT(*)', $clauses['fields'] ) === false ) $clauses['fields'] .= ', tm.meta_key, tm.meta_value ';

    // Join
    $clauses['join'] .= " LEFT JOIN {$wpdb->termmeta} AS tm ON (t.term_id = tm.term_id AND tm.meta_key = 'order') ";

    // Order
    if( isset( $args['menu_order'] ) && !$args['menu_order'] ) return $clauses; // menu_order is false when not added Order Clause

    // Default to ASC
    if( !isset( $args['menu_order'] ) || !in_array( strtoupper( $args['menu_order'] ), array( 'ASC', 'DESC' ) ) ) $args['menu_order'] = 'ASC';

    $order = "ORDER BY CAST(tm.meta_value AS SIGNED) " . $args['menu_order'];

    if ( $clauses['orderby'] ) {
        $clauses['orderby'] = str_replace('ORDER BY', $order . ',', $clauses['orderby'] );
    }else{
        $clauses['orderby'] = $order;
    }

    return $clauses;
}

用法:

add_filter( 'terms_clauses', array( $this, 'terms_clauses') , 10, 3 );

不幸的是,PHP不是我的强项。我想我已经发现这是一个错误,因为PHP7中有新的reules,但我不确定。

如果有人能帮我解决这个问题,我会非常感激。

干杯, 路加。

更新

在@ Norman的评论之后我运行了他建议的代码,这是我得到的输出:

代码:

if( count( $taxonomies ) == 1 ) {
    echo '<pre>';print_r($clauses);
    echo '</pre>';die('call');
}
else {
    return $clauses;
}

结果:

Array
(
    [fields] => t.*, tt.*
    [join] => INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id
    [where] => tt.taxonomy IN ('nav_menu') AND tt.count > 0
    [orderby] => ORDER BY t.name
    [order] => ASC
    [limits] => 
)
call

问题现已修复感谢Norman的评论

1 个答案:

答案 0 :(得分:1)

您需要更改语句,因为当您获得计数时,您需要单独检查它返回的数据

这不是PHP 7问题,它是简单的条件语句错误,您需要确保何时使用count,还需要了解何时使用==和{{1}看到差异here

===

到此if( count( $taxonomies === 1 ) )

然后if( count( $taxonomies ) == 1 )echo '<pre>';print_r($clauses);echo '</pre>';die('call');之前调试实际导致的内容