Конфликт WordPress 5.1.1 с блоками множественного содержимого

#php #wordpress

#php #wordpress

Вопрос:

При обновлении до wordpress 5.1.1 мой сайт выдал ошибку сервера 500. Журнал сказал мне:

 [19-Mar-2019 10:08:34 UTC] PHP Fatal error:  Cannot redeclare has_block() (previously declared in /home/rideands/public_html/wp-includes/blocks.php:81) in /home/rideands/public_html/wp-content/plugins/multiple-content-blocks/assets/inc/template-tags.php on line 67
  

Похоже, что это может быть конфликт с кодом, который находится в больше не поддерживаемом плагине multiple-content-blocks.

Рассматриваемый код, который находится в новой версии WordPress, является:

 /**
 * Determine whether a $post or a string contains a specific block type.
 *
 * This test optimizes for performance rather than strict accuracy, detecting
 * the block type exists but not validating its structure. For strict accuracy,
 * you should use the block parser on post content.
 *
 * @since 5.0.0
 * @see parse_blocks()
 *
 * @param string                  $block_type Full Block type to look for.
 * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. Defaults to global $post.
 * @return bool Whether the post content contains the specified block.
 */
function has_block( $block_type, $post = null ) {
if ( ! has_blocks( $post ) ) {
    return false;
}

if ( ! is_string( $post ) ) {
    $wp_post = get_post( $post );
    if ( $wp_post instanceof WP_Post ) {
        $post = $wp_post->post_content;
    }
}

return false !== strpos( $post, '<!-- wp:' . $block_type . ' ' );
}
  

И код, с которым это конфликтует в плагине с несколькими блоками содержимого, является:

 /**
 * Check if the block has content
 *
 * @param string $name
 * @param array $args Optional. Additional arguments, see get_the_block for more information
 */
function has_block( $name, $args = array() ) {
if( 0 < strlen( get_the_block( $name, $args ) ) ) 
    return true;

return false;
}
  

Есть идеи, как я могу правильно отформатировать код в блоках с несколькими содержимым, чтобы остановить выдачу этой ошибки сервера?

Любая помощь была бы высоко оценена, спасибо!

Ответ №1:

Поскольку несколько блоков содержимого больше не поддерживаются, лучше всего было бы установить расширенные пользовательские поля, которые выполняют ту же работу, но лучше. Если это невозможно, безопасно перезаписать код старого плагина, поскольку он, вероятно, никогда не будет обновлен. FTP для wp-content/plugins/multiple-content-blocks/assets/inc/template-tags.php , найдите строку 62:

 function has_block( $name, $args = array() ) {
  

и замените этим:

 function has_the_block( $name, $args = array() ) {
  

Имя функции не имеет значения, если оно не has_block . Перезагрузите свой сайт, и все должно быть исправлено. Но серьезно сейчас, измените этот плагин. Он не обновлялся в течение 3 лет.

Ответ №2:

Функция has_block является частью ядра WordPress. Плагин не может переопределить эту функцию, поскольку она уже существует. Плагину потребуется использовать другое имя для своей функции.

https://developer.wordpress.org/reference/functions/has_block/