una - diferencia entre pagina y categoria en wordpress
Filtro de Wordpress para modificar la salida final de html (8)
Wordpress tiene un gran soporte de filtro para obtener todo tipo de bits de contenido específicos y modificarlos antes de la salida. Como el filtro "the_content", que le permite acceder al marcado de una publicación antes de enviarla a la pantalla.
Estoy tratando de encontrar un filtro general que me dé una última oportunidad para modificar el marcado final en su totalidad antes de la salida. Alguien sabe de uno?
He navegado la lista de filtros varias veces, pero nada salta a la vista: http://adambrown.info/p/wp_hooks/hook/filters
(He llamado a algunas comunidades específicas de Wordpress para esta pregunta, pero al no haber recibido una sola respuesta, pensé en recurrir al venerable SO.)
@jacer, si usa los siguientes enganches, el header.php también se incluye.
function callback($buffer) {
$buffer = str_replace(''replacing'',''width'',$buffer);
return $buffer;
}
function buffer_start() { ob_start("callback"); }
function buffer_end() { ob_end_flush(); }
add_action(''after_setup_theme'', ''buffer_start'');
add_action(''shutdown'', ''buffer_end'');
AFAIK, no hay gancho para esto, ya que los temas usan HTML que WordPress no procesará.
Sin embargo, podría usar el almacenamiento en búfer de salida para capturar el HTML final:
<?php
// example from php.net
function callback($buffer) {
// replace all the apples with oranges
return (str_replace("apples", "oranges", $buffer));
}
ob_start("callback");
?>
<html><body>
<p>It''s like comparing apples to oranges.</p>
</body></html>
<?php ob_end_flush(); ?>
/* output:
<html><body>
<p>It''s like comparing oranges to oranges.</p>
</body></html>
*/
De hecho, recientemente hubo un debate en la lista de correo de WP-Hackers sobre el tema de la modificación de página completa y parece que el consenso fue que el almacenamiento en búfer de salida con ob_start () etc. era la única solución real. También hubo un debate sobre sus ventajas y desventajas: http://groups.google.com/group/wp-hackers/browse_thread/thread/e1a6f4b29169209a#
En resumen: funciona y es la mejor solución cuando es necesario (como en el complemento WP-Supercache) pero ralentiza las velocidades generales porque no se permite enviar su contenido al navegador como listo, sino que tiene que esperar el documento completo a ser procesado (para ob_end ()) antes de que pueda ser procesado por usted y enviado al navegador.
Estaba usando la mejor solución de esta publicación (por kfriend) por un tiempo. Utiliza un mu-plugin
para almacenar toda la salida.
Pero esta solución rompe el almacenamiento en caché de wp-super-cache
y no se generan archivos de supercaché cuando cargo el mu-plugin
.
Entonces: si está usando wp-super-cache
, puede usar el filtro de este plugin como este:
add_filter(''wp_cache_ob_callback_filter'', function($buffer) {
$buffer = str_replace(''foo'', ''bar'', $buffer);
return $buffer;
});
He tenido problemas con este código, ya que acabo con lo que parece ser la fuente original de la página, por lo que algunos complementos no tienen ningún efecto en la página. Estoy tratando de resolver esto ahora. No he encontrado mucha información sobre las mejores prácticas para recopilar los resultados de WordPress.
Actualización y solución:
El código de KFRIEND no funcionó para mí, ya que captura la fuente no procesada de WordPress, no el mismo resultado que termina en el navegador de hecho. Mi solución probablemente no sea elegante usando una variable global para almacenar los contenidos, pero al menos sé que obtendré el mismo HTML que el que se entregó al navegador. Podría ser que las diferentes configuraciones de complementos crean problemas, pero gracias al ejemplo de código de Jacer Omri de arriba terminé con esto.
Este código está en mi caso ubicado típicamente en functions.php en la carpeta de temas.
$GLOBALS[''oldschool_buffer_variable''] = '''';
function sc_callback($data){
$GLOBALS[''final_html''] .= $data;
return $data;
}
function sc_buffer_start(){
ob_start(''sc_callback'');
}
function sc_buffer_end(){
// Nothing makes a difference in my setup here, ob_get_flush() ob_end_clean() or whatever
// function I try - nothing happends they all result in empty string. Strange since the
// different functions supposedly have very different behaviours. Im guessing there are
// buffering all over the place from different plugins and such - which makes it so
// unpredictable. But that''s why we can do it oldschool :D
ob_end_flush();
// Your final HTML is here, Yeeha!
$output = $GLOBALS[''oldschool_buffer_variable''];
}
add_action(''wp_loaded'', ''sc_buffer_start'');
add_action(''shutdown'', ''sc_buffer_end'');
Puede intentar buscar en el archivo wp-includes / formatting.php. Por ejemplo, la función wpautop. Si está buscando hacer algo con toda la página, consulte el complemento Super Cache. Eso escribe la página web final en un archivo para el almacenamiento en caché. Ver cómo funciona ese complemento puede darte algunas ideas.
WordPress no tiene un filtro de "salida final", pero puedes hackear uno. El ejemplo a continuación reside dentro de un plugin "Debe usar" que he creado para un proyecto.
Nota: No he probado con ningún complemento que pueda hacer uso de la acción de "apagado".
El complemento funciona iterando a través de todos los niveles de búfer abierto, cerrándolos y capturando su salida. Luego dispara el filtro "final_output", haciéndose eco del contenido filtrado.
Lamentablemente, WordPress realiza casi el mismo proceso (cerrando los búferes abiertos), pero en realidad no captura el búfer para filtrar (simplemente lo vacía), por lo que las acciones adicionales de "apagado" no tendrán acceso a él. Debido a esto, la acción a continuación tiene prioridad sobre la de WordPress.
wp-content / mu-plugins / buffer.php
<?php
/**
* Output Buffering
*
* Buffers the entire WP process, capturing the final output for manipulation.
*/
ob_start();
add_action(''shutdown'', function() {
$final = '''';
// We''ll need to get the number of ob levels we''re in, so that we can iterate over each, collecting
// that buffer''s output into the final output.
$levels = ob_get_level();
for ($i = 0; $i < $levels; $i++) {
$final .= ob_get_clean();
}
// Apply any filters to the final output
echo apply_filters(''final_output'', $final);
}, 0);
Un ejemplo de enganche en el filtro final_output:
<?php
add_filter(''final_output'', function($output) {
return str_replace(''foo'', ''bar'', $output);
});
Editar:
Este código usa funciones anónimas, que solo son compatibles con PHP 5.3 o posterior. Si está ejecutando un sitio web con PHP 5.2 o una versión anterior, se está haciendo un flaco favor. PHP 5.2 fue lanzado en 2006, y aunque Wordpress STILL lo admite, no deberías usarlo.
la pregunta es quizás vieja, pero he encontrado una mejor manera de hacerlo.
function callback($buffer) {
// modify buffer here, and then return the updated code
return $buffer;
}
function buffer_start() { ob_start("callback"); }
function buffer_end() { ob_end_flush(); }
add_action(''wp_head'', ''buffer_start'');
add_action(''wp_footer'', ''buffer_end'');
Explicación Este código de complemento registra dos acciones: buffer_start
y buffer_end
.
buffer_start
se ejecuta al final de la sección de encabezado del html. El parámetro, la función de callback
, se llama al final del almacenamiento en búfer de salida. Esto ocurre en el pie de página de la página, cuando se ejecuta la segunda acción registrada, buffer_end
.
La función de callback
es donde agrega su código para cambiar el valor de la salida (la variable $buffer
). Luego simplemente devuelve el código modificado y se mostrará la página.
Notas Asegúrese de utilizar nombres de función únicos para buffer_start
, buffer_end
y callback
, para que no entren en conflicto con otras funciones que pueda tener en los complementos.