Add action

No, you cannot ‘initialise’ or instantiate the class through a hook, not directly. Some additional code is always required ( and it is not a desirable thing to be able to do that, as you’re opening a can of worms for yourself.

Here is a better way of doing it:

class MyClass {  function __construct() {  add_action( 'admin_init',array( $this, 'getStuffDone' ) );  }  function getStuffDone() {  // .. This is where stuff gets done ..  } } $var = new MyClass(); 

Of course one could create an interface class to simplify it for the general case even further:

class IGetStuffDone {  function IGetStuffDone(){  add_action( 'admin_init',array( $this, 'getStuffDone' ) );  }  public abstract function getStuffDone(); } 

Note that as an interface, you can’t create an object of this type directly, but you could create a sub-class, letting you say:

class CDoingThings extends IGetStuffDone {  function getStuffDone(){  // doing things  } } $var = new CDoingThings();     

Which would then automatically add all the hooks, you just need to define what exactly is being done in a subclass and then create it!

On Constructors

I wouldn’t add a constructor as a hook function, it’s bad practice, and can lead ot a lot of unusual events. Also in most languages a constructor returns the object that is being instantiated, so if your hook needs to return something like in a filter, it will not return the filtered variable as you want, but instead it will return the class object.

Calling a constructor or a destructor is very, very, very bad programming practice, no matter which language you’re in, and should never be done.

Constructors should also construct objects, to initialise them ready for use, not for actual work. Work to be done by the object should be in a separate function.

Static class methods, and not needing to instantiate/initialise at all

If your class method is a static class method, you can pass the name of the class in quotes rather than $this as shown below:

class MyClass {  public static function getStuffDone() {  // .. This is where stuff gets done ..  } } add_action( 'admin_init', array('MyClass','getStuffDone' ) ); 

Closures & PHP 5.3

Sadly you cannot avoid the line creating the new class. The only other solution to skipping it would involve boiler plate code that still has that line, and would require PHP 5.3+ e.g.:

add_action('admin_init',function(){  $var = new MyClass();  $var->getStuffDone(); });     

At which point you may as well skip the class, and just use a function:

add_action('admin_init',function(){  // do stuff }); 

But keep in mind you have now introduced the spectre of anonymous functions. There is no way to remove the above action using remove_action, and this can and does cause great pain for developers who have to work with other peoples code.

On Ampersands

You may see actions used like this:

array( &$this, 'getStuffDone' ); 

This is bad. & was added back in PHP 4 when objects were passed as values, not as references. PHP 4 is more than a decade old, and hasn’t been supported by WordPress in a very long time.

There is no reason to use &this when adding hooks and filters, and removing the reference will cause no issues, and may even improve compatibility with future versions of PHP

Use this instead:

array( $this, 'getStuffDone' ); 

wordpress.stackexchange.com

Могу ли я сделать что-то подобное? передать аргументы моей функции?

Да, вы можете! Трюк действительно заключается в том, какую функцию вы передаете add_action и что вы ожидаете от do_action.

  • «my_function_name
  • array (instance, ‘instance_function_name)
  • «StaticClassName:: a_function_on_static_class
  • анонимным
  • лямбда
  • закрытие


Мы можем сделать это с помощью 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 posts  $user_posts = get_posts( $args );   // some commands  echo '<ul>';  foreach ( $user_posts as $post ) {  echo "<li>$post->post_title</li>";  }  echo '</ul>'; } 

Вот упрощенный пример работы с закрытием

$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     

Анонимный против закрытия

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

Класс функции прокси-сервера

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

Пример использования # 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 

Пример использования # 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     

qaru.site

void  CAdminListRow::AddActions(   array $arActions  )

Метод позволяет настроить контекстное меню строки списка. Параметры меню задаются массивом (первый и единственный параметр метода), элементы которого представляют собой ассоциативные массивы со следующим набором ключей:

Ключ Описание
ICON Имя CSS-класса с иконкой действия.
DISABLED Флаг «пункт меню заблокирован» (true|false).
DEFAULT Флаг «пункт меню является действием по умолчанию» (true|false). При двойном клике по строке сработает действие по умолчанию.
TEXT Название пункта меню.
TITLE Текст всплывающей подсказки пункта меню.
ACTION Действие, производимое по выбору пункта меню (Javascript).
SEPARATOR Вставка разделителя {true|false}. При значении, равном true, остальные ключи пункта меню будут проигнорированы.

Пример:

  // сформируем контекстное меню  $arActions = Array();    // редактирование элемента  $arActions[] = array(  "ICON"=>"edit",  "DEFAULT"=>true,  "TEXT"=>GetMessage("rub_edit"),  "ACTION"=>$lAdmin->ActionRedirect("rubric_edit.php?ID=".$f_ID)  );    // удаление элемента  if ($POST_RIGHT>="W")  $arActions[] = array(   "ICON"=>"delete",   "TEXT"=>GetMessage("rub_del"),   "ACTION"=>"if(confirm('".GetMessage('rub_del_conf')."')) ".$lAdmin->ActionDoGroup($f_ID, "delete")  );    // вставим разделитель  $arActions[] = array("SEPARATOR"=>true);    // проверка шаблона для автогенерируемых рассылок  if (strlen($f_TEMPLATE)>0 && $f_AUTO=="Y")  $arActions[] = array(   "ICON"=>"",   "TEXT"=>GetMessage("rub_check"),   "ACTION"=>$lAdmin->ActionRedirect("template_test.php?ID=".$f_ID)  );    // если последний элемент - разделитель, почистим мусор.  if(is_set($arActions[count($arActions)-1], "SEPARATOR"))  unset($arActions[count($arActions)-1]);    // применим контекстное меню к строке  $row->AddActions($arActions);  

dev.1c-bitrix.ru

События

События или действия (actions) в WordPress очень похожи на события в JavaScript. Событие выполняется вызовом функции do_action()
, а добавить функцию к любому событию можно с помощью функции add_action().

При выполнении события или действия, выполняются все функции, добавленные к событию в определенном порядке. Это легче всего понять с помощью простого примера. Определяем три функции, которые будут выводить 1, 2 и 3 соответственно:

function one() { echo 1; }  function two() { echo 2; }  function three() { echo 3; }  

Добавляем функции к событию foo с помощью функции add_action():

add_action( 'foo', 'one' );  add_action( 'foo', 'two' );  add_action( 'foo', 'three' );  

И выполняем наше событие с помощью функции do_action():

do_action( 'foo' ); // выведет 123  

Первый аргумент к функциям — это строка foo — название события. Название может быть любым, но во избежание конфликтов с другими плагинами и темами в собственных событиях лучше использовать префикс, например myplugin_foo, где myplugin это название вашего плагина.

Второй аргумент к функции add_action() — это функция, которая вызывается в момент выполнения события. Функции в рамках одного события выполняются в том же порядке, в котором они были добавлены к событию, за исключением когда функция добавляется к событию с повышенным или пониженным приоритетом. О приоритетах чуть позже.

Итак, наш пример вызовет функции one()
, two() и three() по порядку, что выведет на экран 123. Конечно мы могли самостоятельно вызвать эти функции в этом же порядке на месте do_action(), что дало бы тот же самый результат. Так зачем использовать события?

Зачем использовать события

Любой другой плагин или тема смогут легко добавить или удалить функции из вашего события без необходимости изменять код вашего плагина. Такой подход делает ваш плагин более гибким. Например:

/* В другом плагине */  function four() { echo 4; }    remove_action( 'foo', 'three' );  add_action( 'foo', 'four' );  

Таким образом, когда дело дойдет до вызова события foo в вашем плагине, на экран выведется уже не 123, а 124, поскольку другой плагин удалил функцию three() из вашего события с помощью функции remove_action(), и добавил на ее место новую функцию four().

Пример с выводом чисел не самый полезный. На практике достаточно легко придумать события в вашей теме или в плагине, которые могли бы быть полезными для других плагинов, например:

  • Ваша тема может выполнить событие в момент вывода шапки, и любой плагин сможет вывести на этом месте баннер, не изменяя код вашей темы
  • Ваша тема может выполнить событие в подвале, и с помощью плагина можно будет вставить в подвал любой текст
  • Ваш плагин выводит блок «поделиться» в конце каждой статьи, другой плагин сможет добавить новую социальную сеть в этот же блок

Стоит так же отметить, что в самом ядре WordPress есть более 1500 фильтров и событий, которые можно использовать в темах и плагинах.

Фильтры

Фильтры в WordPress очень похожи на события. Главным отличием является то, что у фильтров есть значение, которое они передают каждой привязанной функции, соответственно каждая функция должна вернуть это же или измененное значение. Рассмотрим простой пример:

function plus_one( $value ) {   $value = $value + 1;   return $value;  }  

Эта функция принимает один аргумент, добавляет к нему единицу и возвращает результат. Добавим нашу функцию к новому фильтру с помощью add_filter():

add_filter( 'foo', 'plus_one' );  

Теперь все функции добавленные к фильтру foo (в нашем случае это всего одна функция) можно легко вызвать или «применить» с помощью функции apply_filters():

echo apply_filters( 'foo', 5 ); // 6  

В функцию apply_filters() вторым аргументом мы передаем фильтруемое значение. Оно может быть любым и оно будет передаваться каждой функции привязанной к фильтру, при этом любой фильтр может это значение изменить.

В данном случае на экран выведется значение 6, поскольку значение 5 было пропущено через функцию plus_one(), которая изменила оригинальную переменную. Если убрать функцию у фильтра с помощью remove_filter(), то наш код выведет первоначальное значение 5:

remove_filter( 'foo', 'plus_one' );  echo apply_filters( 'foo', 5 ); // 5  

Так же как и события, функции к фильтрам могут добавляться в любом другом плагине или в теме, и выполняются эти функции в том порядке, в котором они были добавлены к фильтру, за исключением повышенного или пониженного приоритетов.

Пример хорошего фильтра

Рассмотрим более интересный пример: создадим массив, который будет содержать ссылки на наши профили в социальных сетях и выводить эти ссылки в шапке нашей темы WordPress. В functions.php:

function get_my_social_profiles() {   $profiles = array(   'twitter' => 'http://twitter.com/wpmagru',   'facebook' => 'http://facebook.com/wpmagru',   );   return $profiles;  }

Возвращаемый массив можно использовать в цикле в нашем файле header.php:

$profiles = get_my_social_profiles();  foreach ( $profiles as $service => $url ) {   printf( '<a href="%s">%s</a>', esc_url( $url ), $service );  }  

Данный код выведет ссылки на Twitter и Facebook в шапке нашей темы. Для того чтобы добавить новую ссылку в список, нам придется изменять саму тему, или же создать новый фильтр в функции get_my_social_profiles():

/* В functions.php */  function get_my_social_profiles() {   $profiles = array(   'twitter' => 'http://twitter.com/wpmagru',   'facebook' => 'http://facebook.com/wpmagru',   );   return apply_filters( 'my_social_profiles', $profiles );  }

Таким образом любой плагин или дочерняя тема смогут легко управлять списком социальных профилей, не трогая оригинальную тему. Например, убрать ссылку на Twitter и добавить ссылку на Google+ можно с помощью следующего кода в плагине:

function change_my_social_profiles( $profiles ) {   unset( $profiles['twitter'] );   $profiles['google-plus'] = 'https://plus.google.com/+wpmagru';   return $profiles;  }  add_filter( 'my_social_profiles', 'change_my_social_profiles' );  

Фильтры и события в ядре WordPress

Как мы уже упомянули, в WordPress есть более 2000 фильтров и событий, которыми можно воспользоваться в плагинах или темах для того, чтобы изменить поведение ядра. Рассмотрим несколько интересных примеров.

Отключить комментирование

Отключить комментирование на всем сайте, на зависимо от настроек в параметрах можно с помощью следующего кода:

function my_comments_open() { return false; }  add_filter( 'comments_open', 'my_comments_open' );  

Фильтр comments_open используется в ядре WordPress каждый раз для того, чтобы проверить открыты ли комментарии к той или иной статье. Наша функция всегда возвращает значение false для этого фильтра, поэтому комментарии будут закрыты везде.

Кстати, ядро WordPress определяет несколько вспомогательных функций для работы с подобными фильтрами:

  • __return_true() — возвращает true
  • __return_false() — возвращает false
  • __return_zero() — возвращает 0
  • __return_empty_string() — возвращает пустую строку
  • __return_empty_array() — возвращает пустой массив
  • __return_null() — возвращает null

То есть наш фильтр на comments_open можно переписать в одну строку:

add_filter( 'comments_open', '__return_false' );  

Изменить длину автоматических цитат

За длину автоматических цитат отвечает фильтр excerpt_length:

function my_excerpt_length( $length ) {   $length = 10;   return $length;  }  add_filter( 'excerpt_length', 'my_excerpt_length' );  

С помощью фильтра excerpt_more можно изменить текст, который который ставится в конце автоматический цитаты, по умолчанию это [...]:

function my_excerpt_more( $more ) {   $more = '&rarr;';   return $more  }  add_filter( 'excerpt_more', 'my_excerpt_more' );  

Добавить баннер к содержимому каждой статьи

Фильтр the_content выполняется перед выводом содержимого каждой статьи. Через фильтр проходит само содержимое статьи, поэтому в него легко добавить баннер «на лету» с помощью плагина:

function my_banner( $content ) {   $banner = '<a href="#"><img src="..." /></a>';   $content = $banner . $content;   return $content;  }  add_filter( 'the_content', 'my_banner' );  

Добавить favicon.ico в раздел <head>

В разделе <head> в каждой теме выполняется событие wp_head. Во время этого события можно вывести ссылку на файл favicon.ico, вставить произвольный код JavaScript или CSS и многое другое:

function my_favicon() {   echo '<link rel="shortcut icon" href="http://example.org/favicon.ico" />';  }  add_action( 'wp_head', 'my_favicon' );  

Учтите, что если вам необходимо подключить внешние .js или .css файлы, делать это стоит с помощью функций wp_enqueue_script() и wp_enqueue_style() во время события wp_enqueue_scripts, а не напрямую в wp_head.

В каждой версии WordPress добавляются все больше и больше новых и полезных фильтров и событий. Список большинства фильтров и событий в ядре можно посмотреть на сайте Адама Брауна, или просканировав файлы ядра на «do_action» и «apply_filters».

Приоритеты

Функции добавленные к фильтрам и событиям выполняются в том же порядке, в котором они были добавлены, но порядок легко изменить с помощью приоритетов. Приоритет указывается третьим аргументом к функциям add_action() и add_filter().

Без указания этого аргумента функции к фильтрам и событиям добавляются по умолчанию с приоритетом 10. Функции выполняются от меньшего приоритета к большему, т.е. чем меньше приоритет, тем раньше выполняется функция.

Вернемся к примеру с цифрами:

add_action( 'foo', 'one' );  add_action( 'foo', 'two' );  add_action( 'foo', 'three' );    do_action( 'foo' ); // выведет 123  

Если изменить приоритет выполнения функции three() на 9, то она выполнится раньше остальных:

add_action( 'foo', 'one' );  add_action( 'foo', 'two' );  add_action( 'foo', 'three', 9 );    do_action( 'foo' ); // выведет 312  

Подобным образом, указав приоритет 11 для функции one(), она выполнится позднее всех остальных, несмотря на то, что она была добавлена первой с помощью add_action():

add_action( 'foo', 'one', 11 );  add_action( 'foo', 'two' );  add_action( 'foo', 'three', 9 );    do_action( 'foo' ); // выведет 321  

Дополнительные параметры

В каждую функцию, привязанную к фильтру или событию, легко передать дополнительные параметры. Делается это при вызове функций do_action() или apply_filters(), например:

do_action( 'foo', $arg1, $arg2, $arg3 );  $value = apply_filters( 'foo', $value, $arg1, $arg2, $arg3 );  

Ключевым моментом является то, что при добавлении функции к фильтру или событию нам необходимо указать количество принимаемых аргументов, за это отвечает четвертый параметр функций add_action() и add_filter().

Например, если в функции к событию foo мы хотим принять все три аргумента, необходимо указать 3 в качестве четвертого параметра к add_action():

function my_func( $arg1, $arg2, $arg3 ) { ... }  add_action( 'foo', 'my_func', 10, 3 );  

Подобным образом, если в функции добавленной к фильтру мы хотим принять только $arg1 в качестве дополнительного аргумента, то просим add_filter() передать всего два аргумента — первый аргумент $value, и второй дополнительный аргумент $arg1:

function my_func( $value, $arg1 ) { ... }  add_filter( 'foo', 'my_func', 10, 2 );  

Пример

Хорошим примером передачи дополнительных аргументов является фильтр allow_password_reset, с помощью которого можно запретить сброс пароля для пользователей:

add_filter( 'allow_password_reset', '__return_false' );  

Это запретит сброс пароля для всех пользователей на сайте, но если нам необходимо запретить сброс пароля только супер-администраторам в сети мультисайт (в целях безопасности), мы можем воспользоваться дополнительным аргументом:

function my_filter( $allow, $user_id ) {   if ( is_super_admin( $user_id ) )   $allow = false;     return $allow;  }  add_filter( 'allow_password_reset', 'my_filter', 10, 2 );  

Учтите, что функции привязанные к фильтрам могут изменять только первый аргумент, передаваемый в фильтр. То есть функция приведенная выше может изменить только аргумент $allow, но не $user_id.

Для того, чтобы дать функциям возможно изменять более одного передаваемого аргумента, фильтры (и события) могут воспользоваться передачей переменных и объектов по ссылке в PHP, как это делает например событие pre_get_posts.

ООП, классы, объекты и анонимные функции

Разработчики тем и плагинов WordPress часто предпочитают объектно-ориентированный стиль программирования, где большая часть кода выполняется внутри объекта, а не в глобальном пространстве. Если функциям add_action() и add_filter() необходимо передать не функцию для вызова, а метод объекта, его необходимо передать в специальном формате массивом:

class My_Class {   function __construct() {   add_filter( 'the_content', array( $this, 'filter_content' ) );   }     function filter_content( $content ) {   // ...   return $content;   }  }  new My_Class();  

Похожим образом можно передать статический метод класса:

add_filter( 'the_content', array( 'My_Class', 'filter_content' ) );  add_filter( 'the_content', 'My_Class::filter_content' ); // PHP >= 5.2.3  

Фильтры и события поддерживают и анонимные функции, например:

add_filter( 'the_content', create_function( '$content', 'return $content;' ) );  add_filter( 'the_content', function( $content ) { return $content; } ); // PHP >= 5.3  

Пользоваться анонимными функциями с фильтрами и событиями в WordPress мы не рекомендуем, поскольку их сложно отлаживать (например с помощью плагина Debug Bar Slow Actions) а функция create_function() не кэшируется на уровне байт-кода, например в APC.

Заключение

Фильтры и события лежат в основе самого WordPress, и работу с ними следует освоить каждому разработчику тем и плагинов, ведь именно фильтры и события позволяют расширять ядро популярной системы.

Разработчикам тем и плагинов для WordPress так же не следует забывать о фильтрах и событиях внутри их собственных продуктов для того, чтобы делать их более модульными, гибкими и легко изменяемыми с помощью стороннего кода.

Если у вас возникнут вопросы о фильтрах и событиях в WordPress, оставьте комментарий и мы обязательно вам ответим.

wpmag.ru

Этот вопрос может быть неправильным, я не уверен в этом. Потому что я не понимаю этого.

Я знаю, что add_action используется для привязки нашей функции к указанной функции. Например add_action('wp_head'.'myfunc'); теперь какой код в myfunc будет выполнен в wp_head() . Это ясно, но у меня есть сомнения в do_action что он делает?

  • Разработка плагинов — функции или крючки?
  • Как изменить содержание сообщения?
  • изменить расположение вывода функции плагина с помощью пользовательского подключения
  • Есть ли приложение для обновления ядра и плагинов WordPress?
  • Использовать wp init hook для вызова других крючков?
  • Как определить, вызван ли фильтр в контексте боковой панели / виджета?

Я думаю, что он используется для создания собственного крючка, как уже доступные крючки (wp_head, wp_footer и т. Д.). Если я прав, кто-нибудь может показать мне простой понятный ответ с простым примером.

Я пробовал разницу в Интернете, но все указывают на разницу между add_action и add_filter. Я не хочу туда ехать, потому что сначала я хочу прояснить это, и тогда я перееду туда.

Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ после вопроса POST

 function custom_register() { echo '<script>jQuery(document).ready(function(){alert("Learning Hooks");});</script>'; } do_action('custom'); add_action('custom','custom_register'); 

Я пробовал это в плагине, но я не получил предупреждающее сообщение.

Но когда я подключаю ту же функцию к wp_head тогда она работает нормально

 /******************working****************/ add_action('wp_head','custom_register'); 

Solutions Collecting From Web of «Разница между do_action и add_action»

www.wordpressask.com

Добавлена в Operation Flashpoint, версия: 1.1Arguments localEffects local

Чтобы увидеть описание, наведите курсор на иконку

Заявлено в

Game:
Operation Flashpoint
Version:
1.1

Описание

Описание:
Добавляет запись в меню действий объекта. Если действие «повесили» на объект, то оно может быть активировано только вблизи этого объекта. Добавление действия на объект игрока делает это действие доступным из меню игрока постоянно.

Синтаксис

Синтаксис:
Number = unitName addAction [title, filename, (arguments, priority, showWindow, hideOnUse, shortcut, condition)]

(опциональные параметры неприменимы к OFP, параметр ‘condition’ (условие) применим только для Arma 2)

Параметры:
unitName: Object

[title, filename, (arguments, priority, showWindow, hideOnUse, shortcut, condition)]: Array

title: String or Structured Text — Название действия, отображаемое в пользовательском меню.

filename: String — Путь к файлу-обработчику действия. Является относительным к папке с миссией.

arguments: Anything — (опционально) Аргументы, передаваемые в скрипт (получить к ним доступ в скрипте можно будет как (_this select 3))

priority: Number — (опционально) Приоритет действия. Действия будут отсортированы по убыванию учитывая его. Каждое действие имеет предустановленный приоритет. Значение может быть отридцательным. Записи с одинаковым приоритетом будут расположены в соответствии с порядком создания: новые снизу. Стандартный диапазон начинается с 0 (низкий приоритет. Напр.: ‘Катапультироваться’) и заканчивается 6 (высокий приоритет. Напр: ‘Включить автозависание’).

showWindow: Boolean — (опционально) Если значение истинно (true), то игроки увидят «Titletext» посередине экрана снизу как только приблизятся к объекту. Ложное значение (false) отключает такое поведение.

hideOnUse: Boolean — (опционально) Если значение истинно (true), то меню будет спрятано после использования действия. Иначе меню останется на экране после выбора данного действия, индекс текущего элемента не изменится. Это сделано для того, чтобы позволить игроку быстро использовать одно и тоже действие, либо выбрать другое действие из списка.

shortcut: String — (опционально, по умолчанию:»») Одно из сочетаний клавиш определенных в bin.pbo (напр. «moveForward»)

condition: String — (опционально, только Arma 2, по умолчанию: true) Выражение, которое должно вернуть true, для того, чтобы показать действие в меню. Специальные переменные «_target» (юнит, к которому привязано действие) и «_this» (юнит, который активировал действие) могут быть использованы в выражении.

Возвращаемое значение:
Number или Nothing

Возвращается ID действия. При добавлении новых действий значение ID увеличивается для них. Для первого действия юнита ID будет равно нулю, для второго — единица и т.д. Значения ID передаются в скрипт-обработчик и используются для удаления действия с помощью removeAction.

Примеры

Пример 1:

player addAction ["Hello", "hello.sqf"];
Пример 2:
_genAct = generator addAction ["Включить генератор", "activateGenerator.sqf"];

activateGenerator.sqf:

private ["_gen, "_caller", "_id"]; _gen = _this select 0; _caller = _this select 1; _id = _this select 2; // удаляет действие по его активации _gen removeAction _id 

Этот пример показывает пример создания действия, названного "Включить генератор", добавленного объекту с именем generator. Как только игрок приблизится к объекту, он сможет активировать данное действие с помощью меню действий. Затем выполнится скрипт "activateGenerator.sqf", который, в нашем примере, всего лишь удалит созданное нами действие из объекта generator.

Пример 3:

_actionId = _vehicle addAction ["Включить радар", "missionradarviewRadar.sqf", ["forwardRadar", 8], 1,   false, true, "teamSwitchPrev", "driver _target == player"];

Дополнительная информация

Мультиплеер:
Действие является локальным для машины, на которой исполняется. Для отображения на всех остальных машинах нужно реализовывать свой способ синхронизации.
Проблемы:
В связи с ошибкой в OFP, действия, добавленные через addAction, не обновлялись корректно после входа в технику. Если у вас есть несколько действий, доступных во время входа в технику, они будут показываться даже после того как вы покинете зону действия и будут оставаться там до тех пор, пока вы не выйдете и опять зайдете в технику.
См. также:
removeAction

Комментарии

ru.armacomref.wikia.com

Yes, programmers must speak conceptually to communicate to a broader audience simply because of the self-taught, DIYer, people don’t really understand. Yes technically, do_action() calls another function _wp_call_all_hook() that uses the PHP function call_user_func_array() to call a variable function. However, it is still correct to say that do_action essentially creates the hook.

In my personal opinion, I believe in modular functional code based on a framework created by do_action(). You’re right in that the way my code was written in that post is not the best representation. And it is true that if you have do_action() followed by add_action() the add_action() will not be executed. Here’s what typically happens in WordPress. Take a home.php example. Here’s an example of a home.php using hooks.
[php]
<?php get_header();
do_action( ‘wps_home_before_banner’ ); ?>
<div id="banner">
<?php do_action( ‘wps_banner’ ); ?>
</div><!– end #banner –>
<div class="banner-shadow"></div>

<?php
do_action( ‘wps_home_before’ ); ?>
<div id="content-sidebar-wrap">
<div id="content">
<?php do_action( ‘wps_content’ ); ?>
</div>
<?php get_sidebar(); ?>
</div>

<?php do_action( ‘genesis_home_after’ );

get_footer();
[/php]

So in this code, I’ve hardcoded a frame with some hooks to write modular code. While I still do not believe this to be the best method, it is how more and more themes are operating. As you can see I have no add_action() statements here. In other files (e.g., functions.php, other theme files, a plugin, etc.) I would have the functions that hook into this to create the home page. So consider a home-functions.php that looks something like this:
[php]<?php
add_action( ‘wps_banner’, ‘wps_do_banner’ );
/**
* Outputs widgeted slider area
*/
function wps_do_banner() {
?>
<div class="slider">
<?php if ( ! dynamic_sidebar(‘home-slider’ ) ) : ?>
<div class="widget">
<h3><?php _e( ‘Home Slider’, ‘genesis’ ); ?></h3>
<p><?php _e( ‘Designed for a Slider’, ‘genesis’ ); ?></p>
</div>
<?php endif; ?>
</div><!– end .slider –>
<?php
}

add_action( ‘wps_banner’, ‘wps_do_search’ );
/**
* Outputs widgeted search area
*/
function wps_do_search() {
?>
<div class="home-search">
<h3><?php _e( ‘Homes for Sale’ , ‘genesis’ ); ?></h3>
<?php if ( !dynamic_sidebar( ‘home-search’ ) ) : ?>
<div class="widget">
<h3><?php _e(‘Home Search Area’ , ‘genesis’ ); ?></h3>
<p><?php _e(‘Designed for the MLS Home Search Widget’ , ‘genesis’ ); ?></p>
</div>
<?php endif; ?>
</div><!– end .home-search –>
<?php
}

add_action( ‘wps_banner’, ‘wps_clear’ );
/**
* Outputs clearfix
*/
function wps_clear() {
echo ‘<div class="clear"></div>’;
}

add_action( ‘wps_banner’, ‘wps_banner_bottom’ );
/**
* Outputs widgeted call of actions area
*/
function wps_banner_bottom() {
?>
<?php if ( is_active_sidebar( ‘banner-bottom’ ) ) : ?>
<div class="bottom-widget">
<div class="wrap">
<?php if ( ! dynamic_sidebar( ‘banner-bottom’ ) ) : ?>
<div class="widget">
<h3><?php _e(‘Widget Area’, ‘genesis’ ); ?></h3>
<p><?php _e(‘Designed for Call of Actions or Featured Listings’, ‘genesis’ ); ?></p>
</div>
<?php endif; ?>

</div><!– end .wrap –>
</div><!– end .bottom-widget –>

<?php
endif;
}

add_action( ‘wps_content’, ‘wps_do_feature_content’ );
/**
* Outputs widgeted feature content area
*/
function wps_do_feature_content() {
?>
<?php if ( ! dynamic_sidebar( ‘Home’ ) ) : ?>
<div class="widget">
<h3><?php _e( ‘Widget Area’ , ‘genesis’ ); ?></h3>
<p><?php _e( ‘Designed for Call of Actions or Featured Listings’, ‘genesis’ ); ?></p>
</div>
<?php endif; ?>
}
[/php]

Now in a framework like Genesis, this becomes much simpler because these hooks pre-exist inside the genesis() function call, so hardcoding a home.php file is not necessary. So the home.php file would look more like the second part of modular function code than anything. So…
[php]<?php

// Remove Breadcrumbs
remove_action(‘genesis_before_loop’, ‘genesis_do_breadcrumbs’);

// Add Banner
add_action( ‘genesis_after_header’, ‘wps_do_banner’ );
//previous code

// Add Search widget
add_action( ‘genesis_after_header’, ‘wps_do_search’ );
//previous code

add_action( ‘genesis_after_header’, ‘wps_clear’ );
//previous code

add_action( ‘genesis_after_header’, ‘wps_banner_bottom’ );
//previous code

// Add Optional Features Area
add_action( ‘genesis_before_loop’, ‘wps_do_feature_content’ );
//previous code

genesis();
[/php]

Even using genesis(); I am calling all the add_actions prior to the execution of the do_actions. Does this clarify a bit more?

wpsmith.net

While designing your themes, often times you want to be able to push dynamic content to a particular area of it.  The do_action(), add_action() functions of WP are a great tool to use.

These functions in wordpress allow you to specify a point in the code to trigger or initiate another segment of code.    Like an extension to the original code that’s placed there.   This is used so that different plugins that are created can use those ‘hooks’ in the wordpress code to add to the original core code without having to actually edit the core code itself.

do_action()
http://codex.wordpress.org/Function_Reference/do_action

The WordPress.ORG Codex refers to the usage as:

  do_action($tag, $arg = );  

The $tag refers to the ‘Label’ you specify to hook into; with your add_action function.   The $arg = refers to the arguments that you want to pass through the do_action and into the add_action.

.. That really doesn’t say much on how to actually use the do_action.    What the do_action() function does is set’s a label in a specific point in your code for your plugin or theme code to hook into with the add_action() function.

For example, I place a do_action() right above the blog area of my theme.

  do_action('mytheme_aboveblog');  

What you’re doing when you add the do_action is make it so that at that place in your code you can inject some other code into it. What makes this different then actually hardcoding the function name there? Using the do_action() allows multiple functions to access that particular point in the place you put it at, not just one, which you can use to set different events to occur to trigger them to display or be used there.

add_action()
http://codex.wordpress.org/Function_Reference/add_action

The WordPress.ORG Codex refers to the usage as:

  add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1);  

The $tag refers to the label you specified as the hook in the do_action() function.   $function_to_add refers to what the name of the function is inside your plugin to execute, $priority refers to how much of a priority is given to execution of this function and $accepted_args refers to the number of arguments passed through do_action() to the $function_to_add.

What this is really saying?   The add_action finds the label specified in the $tag and hooks into it saying to that bit of code to “execute this function in addition to what you’re already doing, oh and pass these arguments.”  For example, in my activity monitor plugin:

  add_action('mytheme_aboveblog',  'mytheme_online_user_message');  

Now, whenever the do_action checks for something to be injected into it to be used the add_action will trigger the function mytheme_online_user_message to run.

  function mytheme_online_user_message() {  	global $current_user;  	if (!empty($current_user)) {  		$user_login = addslashes($current_user-&gt;user_login);  		echo &quot;Hello {$user_login}!&quot;;  	}  }  

Now if the user is logged on it will run this function in that do_action place you put it and if the user is online inject that message into that place.

Summary

Placing a do_action()  into your code allows other functions to hook into it to extend the functionality of where that hook is placed, using add_action().

frumph.net


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector