首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WordPress插件因PHP7升级而中断

WordPress插件因PHP7升级而中断
EN

Stack Overflow用户
提问于 2018-04-04 05:38:08
回答 1查看 208关注 0票数 1

一个网站,是建立了一段时间前,由另一个开发人员,我现在正在维护,已损坏。我已经查看了错误日志,这就是我所看到的:

代码语言:javascript
复制
[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上,开发人员已经删除了他/她的帐户,没有支持选项。所以我现在想自己解决这个问题。

我发现了导致这个问题的代码:

代码语言:javascript
复制
if( count( $taxonomies === 1 ) ) $taxonomy = array_shift( $taxonomies );

为了尝试提供更多的上下文,以下是整个功能:

代码语言:javascript
复制
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;
}

以及使用情况:

代码语言:javascript
复制
add_filter( 'terms_clauses', array( $this, 'terms_clauses') , 10, 3 );

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

如果有人能帮我解决这个问题,我会非常高兴的。

干杯卢克。

更新

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

代码:

代码语言:javascript
复制
if( count( $taxonomies ) == 1 ) {
    echo '<pre>';print_r($clauses);
    echo '</pre>';die('call');
}
else {
    return $clauses;
}

结果:

代码语言:javascript
复制
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

由于诺曼的评论,问题现在已经解决了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-04 08:03:00

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

这不是PHP 7的问题,它是简单的条件语句错误,您需要确定何时使用count,还需要了解何时使用===== --参见here

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

对于这个if( count( $taxonomies ) == 1 )

然后在echo '<pre>';print_r($clauses);echo '</pre>';die('call');之前使用return $clauses;来调试实际导致的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49643543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档