Pregunta sobre Speed Contact Bar de Wordpress:

ob_get_clean () crea conflicto

Un usuario preguntó 👇

Hola Martin (@hinjiriyo), encontré un error en PHP ob_get_clean() función. No llama a la recuperación del búfer de salida y puede crear conflictos con otros plugins.

En lugar
$content = ob_get_clean();

Debieras:

$content = ob_get_contents();
ob_clean();

Hace el mismo trabajo, pero esta implementación requiere la ob_start recordar correctamente.

Vea el informe de errores de PHP: https://bugs.php.net/bug.php?id=76563

Más detalles sobre cómo encontré este error: Estamos probando Smart Slider 3 con algunos plugins. Cuando la barra de contacto de velocidad y reseñas (https://wordpress.org/plugins/ultimate-reviews/) está activada, la barra de contacto de velocidad no puede llamarse ob_start () porque el plugin de revisión omite esa acción. Entonces, la barra Speed ​​Contact no pudo abrir el búfer de salida, pero al final cierra uno y cierra un búfer de salida Smart Slider que se recupera y se salta en una recuperación.

(@nextendweb)

Hace 2 años, 5 meses

Trabajé en este caso unas horas para pensar en una nueva idea.

Almacenar el nivel de salida después de la apertura:

private $ob_level = -1;

/**
 * Activate output buffer
 *
 * @since    1.0
 */
public function activate_buffer() {
	// activate output buffer
	ob_start();

	$this->ob_level = ob_get_level();
}

Encuentra el contenido del búfer. Luego limpie el búfer, lo que significa que tendrá un búfer vacío.

public function include_contact_bar() {
	if ( $this->is_login_page() or is_admin() ) {
		return;
	}
	// correct link target for some links if desired
	if ( isset( $this->stored_settings[ 'open_new_window_social_only' ] ) and 1 == $this->stored_settings[ 'open_new_window_social_only' ] ) {
		$contact_target = '';
	} else {
		$contact_target = $this->link_target;
	}
	// get current buffer content and clean buffer
	$content = ob_get_contents();
	ob_clean();

	// esc_url() should be used on all URLs, including those in the 'src' and 'href' attributes of an HTML element.
	// open the bar
	$inject = '<div id="scb-wrapper"';

Cuando usted echo un $content, vuelve a llenar el búfer. Y si el almacenado -> ob_level es igual al ob_get_level () actual, entonces vaciar y cerrar el búfer. (Si el nivel no es igual, puede estar seguro de que no fue usted quien lo abrió).

	}

	// display it
	echo $content;

	if($this->ob_level != -1 && $this->ob_level == ob_get_level()) {
          ob_end_flush();
      }
}

(@hinjiriyo)

Hace 2 años, 5 meses

¡Gracias por compartir sus pensamientos! He implementado sus sugerencias en la versión 6.2 que está publicada actualmente. ¿Cómo funciona en tu instalación?

Si le gusta el plugin, estaría feliz con su revisión.

(@hinjiriyo)

Hace 2 años, 5 meses

La nueva versión 6.3 introduce un pequeño cambio en el uso del búfer de salida. Informe si esta versión le funciona.

(@ cpufix2017)

Hace 2 años, 5 meses

Sigo recibiendo el error de PHP con 6.3

[19-Jul-2018 17:57:19 UTC] Notificación de PHP: ob_clean (): no se pudo borrar el búfer. No hay búfer para eliminar en /home/content/a2pewpnas01_data02/86/3939686/html/wp-content/plugins/speed-contact-bar/public/class-speed-contact-bar.php en línea 791

Y la línea 789 cuando se abre por primera vez.

Esta respuesta fue modificada hace 2 años, 5 meses.

(@nextendweb)

Hace 2 años, 5 meses

Gracias @hinjiriyo, podré verlo después de la próxima semana mientras estoy de vacaciones.

@ cpufix2017: Sería útil si pudiera enumerar todos sus plugins de activación y el nombre de su tema. Probablemente uno de ellos cierra el búfer o se salta el template_redirect acción.

@hinjiriyo: para evitar el error @ cpufix2017 (esto hará que su plugin no elimine la barra, pero no aparecerá ningún mensaje de error)

public function include_contact_bar() {
if ( ob_get_level() == 0) {
  // there is no opened output buffer what we could use
  return false;
}

@hinjiriyo: Si yo fuera usted, probablemente dejaría búferes de salida para este plugin. Insertaría el código HTML en el wp_footer action y colóquelo al principio de la etiqueta del cuerpo con JavaScript. O wp_head con json codificado en html y coloque el código en el lugar correcto con JS.

Esta respuesta fue modificada hace 2 años, 5 meses.

(@ cpufix2017)

Hace 2 años, 5 meses

@nextendweb El mensaje de error que publiqué muestra el nombre del plugin «Barra de contacto rápido». Mi publicación también se realiza en Soporte »Plugin: Barra de contacto rápido» Ob_get_clean () conflicto creado

Así que no estoy seguro de por qué cree que debería hacer lo que dijo @ cpufix2017: sería útil si pudiera enumerar todos sus plugins de activación y el nombre de su tema. Uno de ellos probablemente cerrará el búfer u omitirá la acción template_redirect.

(@nextendweb)

Hace 2 años, 5 meses

@ cpufix2017: Es un foro de soporte de la comunidad y cualquiera puede ayudar a cualquiera, intenté ayudar. Por supuesto, no significa que no puedas esperar a que el desarrollador responda.

(@hinjiriyo)

Hace 2 años, 5 meses

Es trivial porque se ha informado de otro error relacionado con ob. No hubo errores hasta ob_end_flush() o ob_flush() se implementó en el plugin. Estoy pensando en quitarlo.

(@hinjiriyo)

Hace 2 años, 5 meses

No pude recrear tu caso. ¿Podrías favorecerme y probar la versión actual con un pequeño ajuste e informar sobre tu experiencia? Por supuesto, solo hazlo si conoces PHP. Simplemente comente o elimine la línea que contiene ob_flush(); en el archivo “public / class-speed-contact-bar.php”. ¿Habrá alguna diferencia?

¿Solucionó tu problema??

0 / 0

Deja una respuesta 0

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *