php - variable - add_action wordpres
¿Puedo pasar argumentos a mi función a través de add_action? (10)
¿Puedo hacer algo así? pasar argumentos a mi función? Ya estudié add_action doc pero no descubrí cómo hacerlo. Cuál sería la sintaxis exacta para pasar dos argumentos. En particular, cómo pasar texto y argumentos enteros .
function recent_post_by_author($author,$number_of_posts) {
some commands;
}
add_action(''thesis_hook_before_post'',''recent_post_by_author'',10,''author,2'')
ACTUALIZAR
me parece que se hace de alguna manera a través de do_action pero ¿cómo? :-)
¿Puedo hacer algo así? pasar argumentos a mi función?
¡Sí tu puedes! El truco está realmente en qué tipo de función pasas a add_action y qué esperas de do_action .
- ''my_function_name''
- array (instancia, ''instance_function_name'')
- ''StaticClassName :: a_function_on_static_class''
- anónimo
- lambda
- cierre
Podemos hacerlo con un closure .
// custom args for hook
$args = array (
''author'' => 6, // id
''posts_per_page''=> 1, // max posts
);
// subscribe to the hook w/custom args
add_action(''thesis_hook_before_post'',
function() use ( $args ) {
recent_post_by_author( $args ); });
// trigger the hook somewhere
do_action( ''thesis_hook_before_post'' );
// renders a list of post tiles by author
function recent_post_by_author( $args ) {
// merge w/default args
$args = wp_parse_args( $args, array (
''author'' => -1,
''orderby'' => ''post_date'',
''order'' => ''ASC'',
''posts_per_page''=> 25
));
// pull the user''s posts
$user_posts = get_posts( $args );
// some commands
echo ''<ul>'';
foreach ( $user_posts as $post ) {
echo "<li>$post->post_title</li>";
}
echo ''</ul>'';
}
Aquí hay un ejemplo simplificado de un trabajo de cierre
$total = array();
add_action(''count_em_dude'', function() use (&$total) { $total[] = count($total); } );
do_action (''count_em_dude'' );
do_action (''count_em_dude'' );
do_action (''count_em_dude'' );
do_action (''count_em_dude'' );
do_action (''count_em_dude'' );
do_action (''count_em_dude'' );
do_action (''count_em_dude'' );
echo implode ( '', '', $total ); // 0, 1, 2, 3, 4, 5, 6
Anónimo vs. cierre
add_action (''custom_action'', function(){ echo ''anonymous functions work without args!''; } ); //
add_action (''custom_action'', function($a, $b, $c, $d){ echo ''anonymous functions work but default args num is 1, the rest are null - ''; var_dump(array($a,$b,$c,$d)); } ); // a
add_action (''custom_action'', function($a, $b, $c, $d){ echo ''anonymous functions work if you specify number of args after priority - ''; var_dump(array($a,$b,$c,$d)); }, 10, 4 ); // a,b,c,d
// CLOSURE
$value = 12345;
add_action (''custom_action'', function($a, $b, $c, $d) use ($value) { echo ''closures allow you to include values - ''; var_dump(array($a,$b,$c,$d, $value)); }, 10, 4 ); // a,b,c,d, 12345
// DO IT!
do_action( ''custom_action'', ''aa'', ''bb'', ''cc'', ''dd'' );
Clase de función proxy
class ProxyFunc {
public $args = null;
public $func = null;
public $location = null;
public $func_args = null;
function __construct($func, $args, $location=''after'', $action='''', $priority = 10, $accepted_args = 1) {
$this->func = $func;
$this->args = is_array($args) ? $args : array($args);
$this->location = $location;
if( ! empty($action) ){
// (optional) pass action in constructor to automatically subscribe
add_action($action, $this, $priority, $accepted_args );
}
}
function __invoke() {
// current arguments passed to invoke
$this->func_args = func_get_args();
// position of stored arguments
switch($this->location){
case ''after'':
$args = array_merge($this->func_args, $this->args );
break;
case ''before'':
$args = array_merge($this->args, $this->func_args );
break;
case ''replace'':
$args = $this->args;
break;
case ''reference'':
// only pass reference to this object
$args = array($this);
break;
default:
// ignore stored args
$args = $this->func_args;
}
// trigger the callback
call_user_func_array( $this->func, $args );
// clear current args
$this->func_args = null;
}
}
Ejemplo de uso n.º 1
$proxyFunc = new ProxyFunc(
function() {
echo "<pre>"; print_r( func_get_args() ); wp_die();
},
array(1,2,3), ''after''
);
add_action(''TestProxyFunc'', $proxyFunc );
do_action(''TestProxyFunc'', ''Hello World'', ''Goodbye''); // Hello World, 1, 2, 3
Ejemplo de uso n.º 2
$proxyFunc = new ProxyFunc(
function() {
echo "<pre>"; print_r( func_get_args() ); wp_die();
}, // callback function
array(1,2,3), // stored args
''after'', // position of stored args
''TestProxyFunc'', // (optional) action
10, // (optional) priority
2 // (optional) increase the action args length.
);
do_action(''TestProxyFunc'', ''Hello World'', ''Goodbye''); // Hello World, Goodbye, 1, 2, 3
Cree funciones de WP personalizadas con clases
Esto es fácil con las clases, ya que puede establecer variables de objetos con el constructor y usarlas en cualquier método de clase. Entonces, para un ejemplo, así es como la adición de metacajas podría funcionar en clases ...
// Array to pass to class
$data = array(
"meta_id" => "custom_wp_meta",
"a" => true,
"b" => true,
// etc...
);
// Init class
$var = new yourWpClass ($data);
// Class
class yourWpClass {
// Pass $data var to class
function __construct($init) {
$this->box = $init; // Get data in var
$this->meta_id = $init["meta_id"];
add_action( ''add_meta_boxes'', array(&$this, ''_reg_meta'') );
}
public function _reg_meta() {
add_meta_box(
$this->meta_id,
// etc ....
);
}
}
Si considera __construct($arg)
lo mismo que function functionname($arg)
entonces podrá evitar las variables globales y pasar toda la información que necesita a través de cualquier función en el objeto de la clase.
Estas páginas parecen ser buenos puntos de referencia cuando construyes meta / plugins de wordpress ->
Básicamente, do_action
se coloca donde se debe ejecutar la acción, y necesita un nombre más sus parámetros personalizados.
Cuando llegue a llamar a la función usando add_action, pase el nombre de su do_action()
como su primer argumento, y el nombre de la función como el segundo. Entonces algo así como:
function recent_post_by_author($author,$number_of_posts) {
some commands;
}
add_action(''get_the_data'',''recent_post_by_author'',10,''author,2'');
Aquí es donde se ejecuta
do_action(''get_the_data'',$author,$number_of_posts);
Debería funcionar.
Bueno, esto es viejo, pero no tiene una respuesta aceptada. Revivir para que los buscadores de Google tengan algo de esperanza.
Si tiene una llamada add_action
existente que no acepta argumentos como este:
function my_function() {
echo 100;
}
add_action(''wp_footer'', ''my_function'');
Puede pasar un argumento a esa función usando una función anónima como la devolución de llamada de esta manera:
function my_function($number) {
echo $number;
}
$number = 101;
add_action(''wp_footer'', function() { global $number; my_function($number); });
Dependiendo de su caso de uso, es posible que necesite usar diferentes formas de devolución de llamada, posiblemente incluso utilizando funciones declaradas correctamente, ya que a veces puede tener problemas con el alcance.
En lugar de:
add_action(''thesis_hook_before_post'',''recent_post_by_author'',10,''author,2'')
debería ser:
add_action(''thesis_hook_before_post'',''recent_post_by_author'',10,2)
... donde 2 es el número de argumentos y 10 es la prioridad en la que se ejecutará la función. No enumera tus argumentos en add_action. Esto inicialmente me hizo tropezar. Su función se ve así:
function function_name ( $arg1, $arg2 ) { /* do stuff here */ }
Tanto la función add_action como la función entran en functions.php y usted especifica sus argumentos en el archivo de la plantilla (page.php por ejemplo) con do_action como sigue:
do_action( ''name-of-action'', $arg1, $arg2 );
Espero que esto ayude.
Escribí el plugin de WordPress hace mucho tiempo, pero fui a Wordpress Codex y creo que es posible: http://codex.wordpress.org/Function_Reference/add_action
<?php add_action( $tag, $function_to_add, $priority, $accepted_args ); ?>
Creo que deberías pasarlos como una matriz. Mire bajo ejemplos "tomar argumentos".
Adiós
He hecho un código para enviar parámetros y proceso.
function recibe_data_post() {
$post_data = $_POST;
if (isset($post_data)) {
if (isset($post_data[''lista_negra''])) {
$args = array (
''btn'' => ''lista_negra'',
''estado''=> $post_data[''lista_negra''],
);
add_action(''template_redirect'',
function() use ( $args ) {
recibe_parametros_btn( $args ); });
}
if (isset($post_data[''seleccionado''])) {
$args = array (
''btn'' => ''seleccionado'',
''estado''=> $post_data[''seleccionado''],
);
add_action(''template_redirect'',
function() use ( $args ) {
recibe_parametros_btn( $args ); });
}
}
}
add_action( ''init'', ''recibe_data_post'' );
function recibe_parametros_btn( $args ) {
$data_enc = json_encode($args);
$data_dec = json_decode($data_enc);
$btn = $data_dec->btn;
$estado = $data_dec->estado;
fdav_procesa_botones($btn, $estado);
}
function fdav_procesa_botones($btn, int $estado) {
$post_id = get_the_ID();
$data = get_post($post_id);
if ( $estado == 1 ) {
update_field($btn, 0, $post_id);
} elseif ( $estado == 0 ) {
update_field($btn, 1, $post_id);
}
}
Me encontré con el mismo problema y lo resolví mediante el uso de variables globales. Al igual que:
global $myvar;
$myvar = value;
add_action(''hook'', ''myfunction'');
function myfunction() {
global $myvar;
}
Un poco descuidado pero funciona.
Pase en vars desde el alcance local FIRST, luego pase el fn
SEGUNDO:
$fn = function() use($pollId){
echo "<p>NO POLLS FOUND FOR POLL ID $pollId</p>";
};
add_action(''admin_notices'', $fn);
Utilizo el cierre para PHP 5.3+. A continuación, puedo pasar los valores predeterminados y los míos sin globales. (ejemplo para add_filter)
...
$tt="try this";
add_filter( ''the_posts'', function($posts,$query=false) use ($tt) {
echo $tt;
print_r($posts);
return $posts;
} );