web-dev-qa-db-ja.com

プラグイン更新エラーメッセージ

私は、フレームワークが適切に機能するために特定のプラグインバージョンを必要とするクライアントWebサイトに取り組んでいます。

My functions.php ファイルの次のコード行を使用して、プラグインが自分自身を更新して管理ユーザーに更新メッセージを表示するのを防ぎます。

// Disable Cherry Plugin Updates
function filter_plugin_updates( $value ) {
    if(isset($value->response['cherry-plugin/cherry-plugin.php'])) {
        unset($value->response['cherry-plugin/cherry-plugin.php']);
    }
}

上記のコードは問題なく動作しますが、WordPressのバックエンドメニューから特定の変更を加えるとPHPエラーメッセージが表示されることがありますが、特定の変更については一貫していないようです。

"Fatal error: Cannot use object of type WP_Error as array in ../public_html/wp-content/plugins/cherry-plugin/admin/plugin-updater.php on line 63"

上記のファイルを見ると、63行目は、

if ($response['response']['code']!='200') {
    return;
}

そしてそれが含まれている全体の機能は次のとおりです。

// Remote query, function return any data of xml file on server
function cherry_plugin_remote_query($atts){
    global $wp_version;

    $default = array(
                'remote_server' =>  CHERRY_PLUGIN_REMOTE_SERVER,
                'data_type' =>      '',//framework, plugin, notice, info (Or any channel in xml)
                'output_type' =>    'return'//return, echo, notice
            );
    extract(array_merge($default, $atts));
    if($data_type == 'framework' && defined('CHERRY_VER')){
        $current_version = CHERRY_VER;
    }else if($data_type == 'plugin'){
        $current_version = CHERRY_PLUGIN_VERSION;
    }else{
        $current_version = '';
    }

    $response = wp_remote_post( $remote_server, array(
            'body' => array('data_type' => $data_type,
                            'current_version' => $current_version,
                            'api-key' => md5(get_bloginfo('url'))),
            'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo('url')
        )
    );

    if ($response['response']['code']!='200') {
        return;
    }
    $response = unserialize($response['body']);
    if($response==null){
        return;
    }

    switch ($output_type) {
        case 'notice':;
            if(!empty($response) && isset($response['action']) && !empty($response['notice_content'])){
                global $notice_attr;
                $notice_attr =array();
                if(isset($response['wrapper_id'])) $notice_attr['wrapper_id'] = $response['wrapper_id'] ;
                if(isset($response['wrapper_class'])) $notice_attr['wrapper_class'] = $response['wrapper_class'] ;
                if(isset($response['notice_content'])) $notice_attr['notice_content'] = $response['notice_content'] ;

                add_action($response['action'], 'cherry_call_function_add_notice');
                function cherry_call_function_add_notice(){
                    global $notice_attr;
                    echo cherry_add_notice($notice_attr);
                }
            }
        break;

        case 'echo':
            echo $response;
        break;

        default:
            return $response;
        break;
    }
}

どのように私はPHPエラーをスローしないのと同様に、プラグインの更新を停止し、管理者ユーザに更新メッセージを表示することができるでしょうか?

5
user1752759

これは逆方向のやり方のようなものですが、プラグインをアップグレードする機能を無効にしても、プラグインが上書きされることを心配する必要はないと思います。

(プラグインのメインファイルのコメントヘッダにある)プラグインのバージョン番号をばかげて高いものに変更して、ユーザーへのアップグレードを推奨しないようにします。

私は過去にプラグインの最後のバージョンの2番目か3番目が最後の運用バージョンであったときにいくつかのサポートされていないプラグインのためにこれをしなければなりませんでした。

2
Oturia

@gate_engineer で既に述べたように、あなたの問題はあなたが配列としてオブジェクトにアクセスしようとしているところの明白なPHP問題です。

それを述べるだけでなく、もう少し手助けするために、適切な応答オブジェクトに対する 正しいチェック は、 wp_remote_retrieve_response_code() および wp_remote_retrieve_response_message() の戻り値に対してチェックしています。

$response = wp_remote_request( array( /* args */ ) );
// or wp_remote_post()
// or wp_remote_get()
// or wp_remote_head()

if (
    200 !== wp_remote_retrieve_response_code( $response )
    OR 'OK' !== wp_remote_retrieve_response_message( $response )
    OR is_wp_error( $response )
)
    return $response->get_error_message();
    // ...or something more sophisticated using the returned remote API data.

別の安全性チェックはheadersをチェックすることです。

$headers = wp_remote_retrieve_headers( $response );
// do some checks and fixes here like UTF-8 incompability fixes
// for e.g.
in_array( 'Content-Type', $headers )
AND 'utf-8' !== $headers['Content-Type']
    AND $result = utf8_encode( wp_remote_retrieve_body( $response ) );

またはリモートAPIによって返されるカスタムのheaderが存在する可能性があることがわかっている場合は、それを直接使用します。

'no-result' === wp_remote_retrieve_header( $response, 'custom-error-header' )
    AND print 'Response error!';

それからちょうどあなたの結果を取り出しなさい。これはis_wp_error()のための別のチェックを含み、それはbodyが実際に設定されているかどうかをチェックします。エラーであるか、本文がない場合、空の文字列''が返されます。

$result = wp_remote_retrieve_body( $response );
// Custom check:
if ( empty( $result ) )
    _e( 'Nothing returned from request.', 'your_textdomain' );

// Process your result:
echo $result['foo'];
3
kaiser

参照:

致命的エラーの停止:

上記のエラーは、リモートWebサーバーへのリクエストが失敗した場合にwp_remote_post()WP_Errorオブジェクトを返すことが原因です。スクリプトが63行目で次の式を実行すると、

if ( $response['response']['code']!='200' )

... PHPがなぜ[]演算子を使ってオブジェクトにアクセスしようとしているのかについて混乱してしまい、間違った構文のために致命的なエラーが発生するだけです。この場合、63行目の前に$response内のWP_Errorオブジェクトをテストし、失敗した要求条件を適切に処理する必要があります。

2
gate_engineer