web-dev-qa-db-fra.com

Renvoyer une valeur personnalisée dans une fonction ajoutée à un crochet d'action

J'ai étudié la différence entre les hooks action et filter, et autant que je sache, il n'est pas possible d'avoir une fonction qui est ajoutée à un action hook, renvoie une valeur (personnalisée) .

Mon scénario:

  • Lors de la sauvegarde d’un message, je essaie de sauvegarder un autre message. Par conséquent, j'utilise add_action( 'save_post', 'create_another_post');
  • Selon certaines conditions, cette publication supplémentaire est sauvegardée (dans ce cas, j'aimerais renvoyer true) ou elle ne le fait pas (return false)

Comment procéder pour implémenter ce scénario true/false? J'apprécie votre aide et vos idées.

1
SPi

Correct. Les crochets d'action ne renvoient pas de contenu, et honnêtement, si vous avez besoin d'un crochet d'action pour renvoyer du contenu, il y a de bonnes chances que vous fassiez quelque chose de mal. Cependant, si cela s'avère être votre seule option, la méthode la plus propre consiste à utiliser une variable statique:

function action_value_grab() {
  static $value = false;
  $is_hooked = current_filter();
  if (!empty($is_hooked)) {
    $value = true;
  }
  return $value;
}

// var_dump(action_value_grab()); // debug

add_action('test_hook','action_value_grab');
do_action('test_hook');

// var_dump(action_value_grab()); // debug

Appelez simplement la fonction - static_value_grab()-- après que le hook se soit déclenché pour obtenir la valeur de $value.

3
s_ha_dum

à mon avis, il s’agit d’un scénario valide. C’est un bon moyen d’offrir votre plugin comme interface à d’autres plugins, mais chaque plugin peut être actif ou inactif et wp ne plantera pas (par rapport à l’appel direct d’une méthode un plugin n'a pas été activé

je l'ai résolu en passant un objet, comme ceci:

// define action with param for result transport

function some_action($someParam, $transport) {
    // do stuff
    if($someParam > 10) {
         $transport->return = true;
    } else {
         $transport->return = 5;
    }
}
add_action('some_action', 'some_action', 10, 2);


// call action

do_action('some_action', 5, $transport = new stdClass());
var_dump($transport->return);
// output true

do_action('some_action', 11, $transport = new stdClass());
var_dump($transport->return);
// output 5
2
greenone83