2012-09-22 8 views
10

Używam schematu tematycznego dla tematu dla dzieci. Ma wiele haków, ale w szczególności patrzę na thematic_header(). Haczyk thematic_header() dodaje następujące akcje (poprzez additive):Jak zmienić priorytet akcji w Wordpress?

<?php 
    add_action('thematic_header', 'thematic_brandingopen', 1); 
    add_action('thematic_header', 'thematic_blogtitle', 3); 
    add_action('thematic_header', 'thematic_blogdescription', 5); 
    add_action('thematic_header', 'thematic_brandingclose', 7); 
    add_action('thematic_header', 'thematic_access', 9); 
?> 

Treść tych działań jest nieistotna.

Moje pytanie brzmi następująco: Jak zmienić priorytety pięciu wymienionych działań. Na przykład chcę załadować thematic_access() przed thematic_brandingopen(). Jedynym sposobem, aby to zrobić, że byłem w stanie zorientować się, to przez usunięcie i ponowne dodanie działań, Ala:

<?php 
    function remove_thematic_actions() { 
    remove_action('thematic_header', 'thematic_access'); 
    add_action('thematic_header', 'thematic_access', 0); //puts it above thematic_brandingopen 
    } 
    add_action ('init', 'remove_thematic_actions'); 

to wydaje się głupi sposób osiągnięcia czegoś bardzo prostego. Czy istnieje sposób na dostęp i sortowanie/porządkowanie dowolnej struktury danych przechowującej akcje w WP?

Odpowiedz

6

Od WordPress

jeśli hak został zarejestrowany za pomocą priorytet inny niż domyślny 10, trzeba także określić priorytet w wywołaniu remove_action().

Więc myślę, że można najpierw usunąć za pomocą następujących

remove_action('thematic_header', 'thematic_brandingopen', 1); 
remove_action('thematic_header', 'thematic_access', 9); 

i dodatek ponownie stosując różne priority

add_action('thematic_header', 'thematic_access', 1); 
add_action('thematic_header', 'thematic_brandingopen', 2); 
+0

Tak, właśnie to robiłem. Moje pytanie dotyczyło tego, czy istnieje sposób bezpośredniego dostępu do tablicy/jakiejkolwiek aplikacji WP używa do przechowywania priorytetów działań. Będę robił to w ten sposób, ponieważ jestem zbyt leniwy, aby zagłębić się w źródło WP. Wydaje mi się dziwne, że WP nie zapewnia sposobu na zmianę priorytetów działań bez ich usuwania i ponownego dodawania. Pozdrowienia – eldarshamukhamedov

+1

Myślę, że jest to właściwość klasy i może być zadeklarowana jako prywatna/chroniona, ale nie publiczna. Możliwe, że nie ma bezpośredniego dostępu, IMO. –

+0

Na wszelki wypadek, gdy to pomaga komuś, wszystkie podpięte działania są przechowywane w globalnej zmiennej o nazwie $ wp_filter, która jest tablicą z kluczem będącym nazwą haka. – ljelewis

5

nie do samodzielnego promowania ale zrobiłem jakąś pracę w tej sprawie do zapewnić niekodujące rozwiązanie za pomocą wtyczki WordPress o nazwie Prioritize Hooks. Moja wtyczka pozwala ustawić priorytety różnych zarejestrowanych przechwytów za pośrednictwem interfejsu użytkownika i robi nadpisywanie w środowisku wykonawczym, aby kod nie był modyfikowany.

+0

Dzięki! Szukałem rozwiązania do kodowania, ale, co najmniej, jest to interesujące rozwiązanie. Tak trzymaj! :) – eldarshamukhamedov

3

Tylko w przypadku, gdy ktoś pomaga, zmienna działania są przechowywane w to

global $wp_filter; 
var_dump($wp_filter[$hook_name]); 

Która jest tablicą tablic z klawiszy jest priorytetem, gdy dodano działanie.

+1

Pomogło mi to w usunięciu akcji, która była wewnątrz klasy przy użyciu metody klasy jako wywołania zwrotnego. Istnieją różne odpowiedzi dotyczące tego, jak usunąć akcję "prawidłowo", ale są one dość zaangażowane i działają warunkowo. Właśnie dodałem globalny $ wp_filter; i unset ($ wp_filter ['hookname'] [priority]); – Exit