add_filter nu funcționează cum mă așteptam

6 apr. 2015, 17:05:21
Vizualizări: 15.2K
Voturi: 1

Am un plugin WordPress unde am inclus acest cod (cu unele modificări)

$fep_files = array(
    'first' => 'first.php',
    'second' => 'second.php'
);

$fep_files = apply_filters('include_files', $fep_files );

foreach ( $fep_files as $fep_file )
require_once ( $fep_file );
unset ( $fep_files );

Acum am adăugat în functions.php al temei mele:

function fep_remove ( $fep_files )
{
    if ( isset ( $fep_files['first'] ) ) {
        unset ( $fep_files['first'] );
            }
        //die($fep_files); //pentru a verifica dacă se execută
    return $fep_files;
}

add_filter( 'include_files', 'fep_remove' );

Ar trebui să elimine first.php dar nu o face. Unde greșesc? Există o metodă mai bună de a include fișiere unde utilizatorul poate include/exclude orice fișiere dacă este nevoie?

6
Comentarii

Ești sigur că codul plugin-ului este executat după ce tema a fost încărcată?

fuxia fuxia
6 apr. 2015 17:08:26

Cum pot fi sigur? Există vreo metodă mai bună de a include fișiere unde utilizatorul poate include/exclude anumite fișiere dacă este nevoie (folosind hook-uri)?

Shamim Hasan Shamim Hasan
6 apr. 2015 17:18:10

Aș sugera să începi prin a te asigura că nu ai o coliziune de namespace. Denumește hook-ul ceva de genul 'myplugin_include_files' (unde "myplugin" reprezintă numele plugin-ului tău). Dacă denumești hook-ul prea simplu, s-ar putea să ai conflicte.

butlerblog butlerblog
6 apr. 2015 17:40:25

Codul tău funcționează când îl testez. Asta va face dificilă identificarea sursei problemei tale specifice. Trebuie să menționez că a cere codare hardcodată într-o temă pentru ca un plugin să funcționeze este o practică destul de proastă.

s_ha_dum s_ha_dum
6 apr. 2015 18:21:09

În codul real al plugin-urilor, hook-urile nu sunt prea simple.

Shamim Hasan Shamim Hasan
6 apr. 2015 19:40:18

cum ai testat @s_ha_dum? primul cod (care include apply_filters) este în plugin-ul meu (fișierul principal care conține informațiile despre plugin) astfel încât să pot include alte fișiere necesare pentru acel plugin. Am adăugat apply_filters astfel încât oricine să poată include/exclude orice fișier fără a modifica codul de bază al plugin-ului. Acum, dacă cineva vrea să excludă first.php din acel cod, poate adăuga codul (din întrebarea mea care are add_filter) în fișierul function.php al temei sale. Cât de rău este acest lucru?

Shamim Hasan Shamim Hasan
6 apr. 2015 19:50:41
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 3
1

Cred că unele dintre răspunsurile de aici necesită o actualizare. (Doar pentru cazul în care eu sau alții vom ajunge pe această pagină în viitor în căutarea unui răspuns).

Ordinea plugin-urilor pare să depindă de tipul de instalare WordPress cu care lucrezi. Dacă lucrezi cu o instalare Multisite, atunci plugin-urile sunt într-adevăr procesate în ordinea în care sunt activate.

Cu toate acestea, într-o instalare WordPress simplă, acestea sunt activate alfabetic. Așadar, dacă întâmpini o problemă unde trebuie să actualizezi un filtru de inițializare sau o acțiune pentru un alt plugin, cea mai bună soluție este să denumești plugin-ul tău cu ceva care începe cu un underscore.

De exemplu: _my_custom_plugin/my_custom_plugin.php

Pentru referință, te rugăm să consulți liniile 704-713 din wp-admin/includes/plugin.php

21 dec. 2020 11:05:34
Comentarii

Hmm, cred că ar fi mai bine să te bazezi pe un hook, de exemplu un handler plugins_loaded cu prioritate mare, decât pe ordinea alfabetică, dar aceste informații sunt utile - mulțumesc

Rup Rup
21 dec. 2020 12:02:45
1

Codul tău de plugin va rula înaintea codului temei și, prin urmare, va rula înainte ca orice să fie adăugat la hook. Va trebui să muti codul care procesează includerea fișierului pe un alt hook care rulează după ce toate plugin-urile sunt încărcate, cum ar fi after_setup_theme.

Aceasta ar putea ajuta: Există o diagramă de flux pentru secvența de încărcare WordPress?

7 apr. 2015 02:48:46
Comentarii

Am făcut deja asta și acum funcționează perfect. Tu mi-ai oferit aceeași soluție. Accept și răspunsul tău.

Shamim Hasan Shamim Hasan
7 apr. 2015 17:22:37
1
-1

Răspunsul anterior a fost bun în ceea ce privește ordinea, dar nu am reușit să fac să funcționeze filtrul/hook-ul conform acelor instrucțiuni.

Soluția mea a fost crearea unui plugin personalizat care conține filtrul, asigurându-mă că acesta vine în ordine alfabetică înaintea plugin-ului care conține filtrul pe care vreau să îl adaug.

Cu alte cuvinte, am plasat codul în plugings/a-custom-plugin.php începând fișierul cu:

<?php
/*
Plugin Name: My Custom Plugin
*/
26 ian. 2016 04:12:49
Comentarii

Pluginii nu rulează în ordine alfabetică - de fapt, ei rulează în ordinea activării, deoarece atunci când un plugin este activat, acesta este adăugat în array-ul de pluginii activi stocați în baza de date. ( wp_options -> active_plugins )

Bysander Bysander
19 mar. 2020 13:46:56