init în WordPress

Hooks folosite des WordPress 1.5.0

Acțiunea care rulează după ce WordPress s-a încărcat, înainte de trimiterea antetelor; locul pentru tipuri de conținut, taxonomii și formulare.

Sintaxă
do_action( 'init' )
add_action( 'init', 'dex_functie' );

Ce face init

init rulează la fiecare cerere, după ce WordPress, pluginurile și tema s-au încărcat și utilizatorul a fost autentificat, dar înainte să se trimită antetele HTTP. Aici se înregistrează tipurile de conținut (register_post_type()), taxonomiile, shortcode-urile și tot aici se pot intercepta datele trimise prin $_POST sau $_GET.

Interogarea principală nu a rulat încă: funcții ca is_single() sau is_page() nu au răspuns la init. Pentru cod care depinde de pagina afișată, folosește template_redirect sau wp. Dacă ai nevoie de momentul în care WordPress s-a încărcat complet, documentația recomandă wp_loaded.

Pentru panoul de administrare există și admin_init, care rulează doar în zona de administrare.

Exemple

Exemplul 1: Un tip de conținut pentru meniul cafenelei

Tipurile de conținut se înregistrează la init, ca să existe la fiecare cerere.

add_action( 'init', 'dex_tip_meniu' );

function dex_tip_meniu() {
    register_post_type( 'dex_meniu', array(
        'label'        => 'Meniu',
        'public'       => true,
        'has_archive'  => true,
        'show_in_rest' => true,
        'supports'     => array( 'title', 'editor', 'thumbnail' ),
    ) );
}

Exemplul 2: Procesarea unui formular de abonare

Formularul din pagină trimite câmpul dex_email și un nonce. Verificăm nonce-ul, curățăm adresa, o salvăm și redirecționăm, ca reîncărcarea paginii să nu trimită formularul de două ori.

add_action( 'init', 'dex_proceseaza_abonare' );

function dex_proceseaza_abonare() {
    if ( ! isset( $_POST['dex_email'], $_POST['dex_nonce'] ) ) {
        return;
    }
    if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['dex_nonce'] ) ), 'dex_abonare' ) ) {
        return;
    }
    $email = sanitize_email( wp_unslash( $_POST['dex_email'] ) );
    if ( is_email( $email ) ) {
        $lista   = get_option( 'dex_abonati', array() );
        $lista[] = $email;
        update_option( 'dex_abonati', array_unique( $lista ) );
    }
    wp_safe_redirect( home_url( '/multumim/' ) );
    exit;
}

Greșeli frecvente

  • Cod lent la init: rulează la fiecare cerere (pagini, administrare, AJAX, REST, cron). Cererile HTTP externe sau interogările grele încetinesc tot site-ul.
  • flush_rewrite_rules() la fiecare init: regenerează regulile de URL la fiecare cerere. Apelează-l o singură dată, la activarea pluginului.
  • is_page(), is_single() la init: interogarea nu a rulat încă și răspunsul nu e cel așteptat. Folosește template_redirect.

Comenzi înrudite

  • add_action: Leagă o funcție de o acțiune WordPress, ca să ruleze automat când WordPress ajunge în acel punct.
  • register_post_type: Înregistrează un tip de conținut personalizat (produse, evenimente, rețete), cu meniu propriu în administrare.
  • register_taxonomy: Creează o taxonomie proprie (ca Categorii sau Etichete), de exemplu „Oraș” pentru produse sau evenimente.
  • template_redirect: Acțiunea care rulează înainte ca WordPress să aleagă șablonul paginii; locul potrivit pentru redirecționări.
  • wp_nonce_field: Adaugă într-un formular un câmp ascuns cu un nonce, un cod care dovedește că cererea pornește chiar de pe site-ul tău.