it-swarm.com.de

Plugin Update Fehlermeldung

Ich arbeite an einer Client-Website, auf der das Framework eine bestimmte Plugin-Version benötigt, um ordnungsgemäß zu funktionieren.

Mit den folgenden Codezeilen in der Datei my functions.php wird verhindert, dass sich das Plugin selbst aktualisiert und dem Administrator eine Aktualisierungsnachricht anzeigt:

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

Der obige Code funktioniert einwandfrei. Manchmal wird jedoch eine PHP -Fehlermeldung ausgegeben, wenn bestimmte Änderungen im WordPress-Backend-Menü vorgenommen werden, und scheint bei einer bestimmten Änderung nicht konsistent zu sein:

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

In der obigen Datei ist Zeile 63:

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

Und die gesamte darin enthaltene Funktion ist:

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

Wie kann ich verhindern, dass das Plugin aktualisiert wird, eine Aktualisierungsnachricht für den Administrator angezeigt wird und PHP Fehler ausgegeben werden?

5
user1752759

Ich weiß, dass dies eine Art Rückwärtsmethode ist, aber ich nehme an, wenn Sie die Möglichkeit deaktivieren, das Plugin zu aktualisieren, brauchen Sie sich keine Sorgen zu machen, dass das Plugin überschrieben wird.

Ändern Sie die Versionsnummer des Plugins (im Kommentarheader der Hauptdatei des Plugins) in etwas Lächerlich Hohes, damit dem Benutzer kein Upgrade empfohlen wird.

Ich musste dies für einige nicht unterstützte Plugins in der Vergangenheit tun, als die zweit- oder drittletzte Version des Plugins die letzte Betriebsversion war.

2
Oturia

Wie @gate_engineer bereits angegeben, handelt es sich bei Ihrem Problem um ein einfaches PHP Problem, bei dem Sie versuchen, auf ein Objekt als Array zuzugreifen.

Um dies nicht nur zu verdeutlichen, sondern Ihnen auch weiterzuhelfen, vergleicht correct check für ein ordnungsgemäßes Antwortobjekt den Rückgabewert von wp_remote_retrieve_response_code() und 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.

Eine weitere Sicherheitsüberprüfung wäre, die headers zu überprüfen:

$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 ) );

oder/und wenn Sie wissen, dass möglicherweise eine benutzerdefinierte header von der Remote-API zurückgegeben wird, verwenden Sie diese direkt:

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

Dann holen Sie einfach Ihr Ergebnis. Dies wird eine weitere Prüfung für is_wp_error() enthalten sowie prüfen, ob die body tatsächlich gesetzt ist. Wenn es sich um einen Fehler handelt oder kein Text vorhanden ist, wird eine leere Zeichenfolge zurückgegeben: ''.

$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

Referenzen:

Beenden des schwerwiegenden Fehlers:

Der Fehler, den Sie oben erhalten, beruht auf der Tatsache, dass wp_remote_post() ein WP_Error-Objekt zurückgibt, wenn eine Anforderung an den Remotewebserver fehlgeschlagen ist. Wenn das Skript den nächsten Ausdruck in Zeile 63 ausführt:

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

... PHP ist verwirrt, warum Sie versuchen, mit dem Operator [] auf ein Objekt zuzugreifen, und wirft Ihnen einfach einen schwerwiegenden Fehler aufgrund falscher Syntax vor. In diesem Fall müssten Sie vor Zeile 63 nach einem WP_Error-Objekt in $response suchen und die fehlgeschlagene Anforderungsbedingung entsprechend behandeln.

2
gate_engineer