wordpres variable una pasar otra funcion add_action php wordpress

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; } );