web-dev-qa-db-fra.com

Message d'erreur de mise à jour du plugin

Je travaille sur un site Web client où le cadre nécessite une version de plug-in spécifique pour fonctionner correctement.

Avec les lignes de code suivantes dans mon fichier functions.php , le plugin s’empêche de se mettre à jour et d’afficher un message de mise à jour à l’administrateur:

// 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']);
    }
}

Le code ci-dessus fonctionne bien, cependant, il y aura parfois un message d'erreur PHP lorsque vous apporterez certaines modifications à partir du menu principal de WordPress.

"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"

Visualiser le fichier ci-dessus, la ligne 63 est:

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

Et la fonction entière à l'intérieur est:

// 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;
    }
}

Comment pourrais-je empêcher le plug-in de se mettre à jour, d'afficher un message de mise à jour à l'utilisateur admin, ainsi que de ne pas générer d'erreur PHP?

5
user1752759

Je sais que c'est un peu une façon de faire en arrière, mais je suppose que si vous désactivez la possibilité de mettre à jour le plug-in, vous n'avez pas à vous soucier de son écrasement.

Changez le numéro de version du plugin (dans l'en-tête de commentaire du fichier principal du plugin) en un nombre ridiculement élevé afin qu'il ne recommande pas une mise à niveau à l'utilisateur.

J'ai eu à faire cela pour certains plugins non pris en charge dans le passé, lorsque la deuxième ou troisième version du plugin était la dernière version opérationnelle.

2
Oturia

Comme @gate_engineer déjà indiqué, votre problème est un problème simple PHP dans lequel vous essayez d'accéder à un objet en tant que tableau.

Pour non seulement indiquer cela, mais aussi vous aider un peu plus loin, la vérification correcte pour un objet de réponse approprié vérifie la valeur de retour de wp_remote_retrieve_response_code() et 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.

Une autre vérification de sécurité consisterait à vérifier la 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 ) );

ou/et si vous savez qu'il peut y avoir une header personnalisée renvoyée par l'API distante, utilisez-la directement:

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

Ensuite, récupérez votre résultat. Cela contiendra une autre vérification pour is_wp_error() ainsi que si la body est réellement définie. S'il s'agit d'une erreur ou qu'aucun corps n'est ici, il renvoie une chaîne vide: ''.

$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

Références:

Arrêt de l'erreur fatale:

L'erreur que vous recevez ci-dessus est due au fait que wp_remote_post() renvoie un objet WP_Error si une demande adressée au serveur Web distant a échoué. Lorsque le script exécute la prochaine expression de la ligne 63:

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

... PHP ne comprend pas pourquoi vous essayez d'accéder à un objet à l'aide de l'opérateur [] et vous renvoie simplement une erreur fatale en raison d'une syntaxe incorrecte. Dans ce cas, vous devez tester avant la ligne 63 un objet WP_Error dans $response et traiter correctement la condition de demande ayant échoué.

2
gate_engineer