Erro 500! Incompatibilidade entre plugins

Recentemente me deparei com um erro ao tentar editar a descrição de uma coleção dentro do site em que atuo. Busquei este fórum para ver se já haviam relatado o erro e me deparei com o fato de que ainda não havia sido relatado, por isso, este registro.

Logo após verificar o problema com a edição da descrição da coleção, tentei verificar se a edição, criação e exclusão de um item também incorreria no problema, a resposta foi sim. Ao buscar o inspecionar elemento quando do momento da edição da descrição da coleção, deparei com a seguinte informação:

{
    "code": "internal_server_error",
    "message": "<p>H\u00e1 um erro cr\u00edtico no seu site.<\/p><p><a href=\"https:\/\/wordpress.org\/documentation\/article\/faq-troubleshooting\/\">Saiba mais sobre a como resolver problemas do WordPress.<\/a><\/p>",
    "data": {
        "status": 500,
        "error": {
            "type": 1,
            "message": "Uncaught TypeError: Argument 3 passed to TEC\\Events\\Calendar_Embeds\\Calendar_Embeds::disable_slug_changes() must be of the type array, object given, called in \/var\/www\/html\/forumeja\/public_html\/wp-includes\/class-wp-hook.php on line 324 and defined in \/var\/www\/html\/forumeja\/public_html\/wp-content\/plugins\/the-events-calendar\/src\/Events\/Calendar_Embeds\/Calendar_Embeds.php:163\nStack trace:\n#0 \/var\/www\/html\/forumeja\/public_html\/wp-includes\/class-wp-hook.php(324): TEC\\Events\\Calendar_Embeds\\Calendar_Embeds->disable_slug_changes()\n#1 \/var\/www\/html\/forumeja\/public_html\/wp-includes\/plugin.php(205): WP_Hook->apply_filters()\n#2 \/var\/www\/html\/forumeja\/public_html\/wp-includes\/post.php(4761): apply_filters()\n#3 \/var\/www\/html\/forumeja\/public_html\/wp-content\/plugins\/tainacan\/classes\/repositories\/class-tainacan-repository.php(182): wp_insert_post()\n#4 \/var\/www\/html\/forumeja\/public_html\/wp-content\/plugins\/tainacan\/classes\/repositories\/class-tainacan-collections.php(566): Tainacan\\Repositories\\Repository->insert()\n#5 \/var\/www\/h",
            "file": "\/var\/www\/html\/forumeja\/public_html\/wp-content\/plugins\/the-events-calendar\/src\/Events\/Calendar_Embeds\/Calendar_Embeds.php",
            "line": 163
        }
    },
    "additional_errors": []
}

Ao ler o código acima percebi que o mesmo referenciava um outro plugin que usamos na instância, o ‘The Events Calendar – Plugin do WordPress | WordPress.org Brasil’. Usando o GPT na tentativa de entender o erro, fui informado que o problema, na avaliação do chatbot, vinha mesmo do plugin ‘The Events Calendar’. O plugin estava se “enfiando” em um filtro ou hook do WordPress (wp_insert_post) que também é usado pelo Tainacan para criar ou editar coleções. O problema é que o Tainacan parece estar passando um objeto como terceiro argumento para esse hook, enquanto o The Events Calendar espera um array.

Uncaught TypeError: Argument 3 passed to Calendar_Embeds::disable_slug_changes()
must be of the type array, object given

Segundo o chatbot, essa é uma falha do plugin ‘The Events Calendar’, pois ele deveria verificar o tipo da variável antes de tentar operar sobre ela.


Implementação da correção

Como forma de contornar esse problema, mesmo que momentaneamente, realizei a edição do código do ‘The Events Calendar’ a partir do editor de arquivos de plugin no Wordpress, alterando diretamente o arquivo Calendar_Embeds.php, em que adicionei uma verificação com is_array() antes da manipulação do parâmetro. Assim, o código ignora execuções que não atendem ao tipo esperado, evitando que o erro interrompa o funcionamento do Tainacan.

Código implementado:

public function disable_slug_changes( $can_change_slug, $post, $postarr ) {
    if ( ! is_array( $postarr ) ) {
        return $can_change_slug;
    }

Após a execução da alteração, ativei novamente o plugin e verifiquei se a criação/edição de coleções e itens voltou a funcionar e a resposta é sim! Realizei testes e não foi notado outros problemas.

IMPORTANTE - A mudança executada dentro do código do plugin não é permanente, uma vez que pode ser sobrescrita ao atualizar o plugin.

2 curtidas

Oi @rodrigo_freire

A ironia aqui é que nesta função disable_slug_changes eles nem usam o 3º argumento… mas acabam precisando passar porque o 4º eles usam. O WordPress não define a tipagem na assinatura de funções como a wp_insert_post, mas outros plugins que usam filtros quem chamam a mesma podem usar então ficamos suscetíveis à isso. De qualquer forma, do nosso lado podemos sim forçar o tipo para garantir que isso não aconteça. Já fizemos um teste aqui e aparentemente não quebrou nada… mas se quiser ir usando antes do próximo lançamento:

De qualquer forma realmente não é muito recomendado editar arquivos de plugins diretamente, por isso o ideal é no futuro atualizar o Tainacan e o próprio plugin dos Calendários.

1 curtida

Yo también me he encontrado con este error y precisamente tenía ese plugin instalado: The Events Calendar.

Probaré con la esta versión que proporciona @mateus y les comento como me fue.
Gracias!

2 curtidas

After a few days with the version shared by @mateus.m.luna I have not had again the problem of Tainacan crashing with ‘The Events Calendar’ plugin.

This mainly happened to me when adding x metadata to x collection.

Thanks in advance!

2 curtidas