Me encuentro necesitando pasar datos personalizados a un filtro proporcionado por un complemento de terceros. Todas las formas en que he visto hacer esto son realmente complicadas y difíciles de entender.
Toma este ejemplo:
$score = 42; //Some crazy calculation I don't want to repeat.
function add_score_to_title($title) {
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
¿Cómo puedo pasar la $score
variable a add_score_to_title()
?
Lo que terminé haciendo fue agregar mi variable al $wp
objeto global . Entonces terminas con esto:
global $wp;
$score = 42; //Some crazy calculation I don't want to repeat.
$wp->some_random_name_for_score = $score;
function add_score_to_title($title) {
global $wp;
$score = $wp->some_random_name_for_score;
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
¿Sucio? Tal vez. ¿Simple? ¡Sip! ¿Alguna desventaja de esta técnica? Por favor discutelo.
ACTUALIZACIÓN Aquí está el código completo en cuestión -> http://pastebin.com/fkSXY04m
$score
se calcula recorriendo un conjunto de cosas e incrementando una variable. pastebin.com/fkSXY04mRespuestas:
Tienes al menos dos opciones:
Globalizar la variable
Ajustar el cálculo del puntaje
Si solo necesita el cálculo de puntaje dentro del filtro, inserte la lógica en la devolución de llamada:
Mejor aún, podría ajustar su cálculo de puntaje en una función propia y luego llamar a esa función dentro de su devolución de llamada:
Si tiene problemas para hacer referencia al
$_POST
objeto, también puede registrar su variable de consulta y luego usarlaget_query_var()
internamente para obtener datos:Con esto en su lugar,
$_POST['Q']
se puede reemplazar conget_query_var('Q')
.fuente
$score
primero y luego lo globalicé. No es de extrañar que no funcionara. ¡Gracias!Llame a la función en cualquier parte de su script para obtener la puntuación, solo se calculará una vez.
Otra forma, usando funciones anónimas :
fuente
add_filter()
niadd_action()
llamadas. No se pueden eliminar a través deremove_function()
.remove_filter()
yremove_action()
. Y no hay ninguna razón por la que los filtros de Complemento / Tema no puedan eliminarse razonablemente: anule las colas de la hoja de estilo del Complemento, Temas infantiles, etc.El siguiente ejemplo ve la variable
$my_calculation
en el alcance global, sin embargo, desde nuestra función local, debemos declararglobal $my_calculation
para acceder a la variable en el alcance global.Esta es solo una forma de hacerlo y parece estar ordenada. Que este trabajo para usted?
fuente
print
oecho
su resultado asegurarse de que su función esté funcionando antes de pasarla al filtro?$score
sí funciona. Me burlé y establecí$score
primero luego globalizado, lo que claramente no funciona. Hacerlo de la manera adecuada al globalizar$score
primero y luego darle un valor funciona como se esperaba. Gracias a todos.