Metabox
Perfekcyjny Pan zaplecza dzisiaj poleca: METABOXY. WordPress jest banalny – bo wszystko jest postem – wpis jest postem, strona jest postem, zamówienie jest postem – w bazie danych jest postem. Ale na zapleczu wygląda bardzo logicznie i „rozbudowanie”. Za to rozbudowanie i porządek podczas edycji odpowiadają pudełka czyli metaboxy. W metabox ujęte są kateogorie danego postu, tagi, obrazek wyróżniający i sam wpis. Ale nie stoi nic na przeszkodzie byśmy mieli wpływ na to jaką jeszcze szufladę danych doczepić sobie do naszego wpisu lub produktu.
Hook pozwalający zarejestrować meta box dla dowolnego typu posta – add_meta_boxes
function adding_custom_meta_boxes( $post_type, $post ) { add_meta_box( 'my-meta-box', __( 'My Meta Box' ), 'render_my_meta_box', 'post', 'normal', 'default' ); } add_action( 'add_meta_boxes', 'adding_custom_meta_boxes', 10, 2 );
Dla konkretnego typu posta (np. produkt woocommerce) lepiej użyć add_meta_boxes_{post_type}
Takie wywołanie jest bardziej efektywne, gdyż wykonywane jest tylko podczas tworzenia wskazanego rodzaju postów (produkt w woocommerce to też post).
Weźmy bardzo konkretny przykład. Chcielibyśmy do produktów w naszym sklepie woocommerce dodać dodatkowe pole, w którym na przykład podamy skład produktu (dla uproszczenia niech to będzie sklep z kosmetykami).
function metabox_sklep_kosmetyczny( $post ) { add_meta_box( 'skladniki', // id metaboxa 'Skład produktu', //nazwa metaboxa 'skladniki_content', //funkcja w której wygenerujemy zawartość metaboxa 'product', //dla jakiego typu posta 'normal', 'default' //default, high, low ); } add_action( 'add_meta_boxes_product', 'metabox_sklep_kosmetyczny' );
I teraz możemy zająć się stworzeniem zawartości naszego pudełka.
function skladniki_content() { global $post; $content = get_post_meta($post->ID, 'custom_editor', true); wp_editor ( $content , 'skladniki_content', array ( "media_buttons" => true ) ); }
W ten sposób utworzyliśmy dodatkowe pole dla produktu, które korzysta z wbudowanego edytora tekstu.
Oczywiście w ten sposób możemy iść dalej i stworzyć dodatkowe pole „przeznaczenie produktu”, „sposób użycia” lub dowolne inne. Wszystko co nam potrzebne do indywidualnego określenia produktu. Należy jedynie pamiętać, że metoda ta najlepiej się sprawdza gdy mówimy o unikalnych cechach danego produktu. Jeśli chcemy dodać cechę, która powtarza się w wielu produktach (choćby opis producenta) jest na to dużo lepszy sposób – taksonomie, o których w innym artykule.
Ale wracamy do metaboxów. Przed nami ostatni etap – wpisane dane trzeba przetworzyć i zapisać w bazie. W wielu artykułach pomija się szczegóły tego zapisu ale według mnie istotne jest również gdzie i jak te dane są zapisywane, gdyby nam kiedyś przyszła ochota na pogrzebanie w mysqlu, ale o tym na końcu.
Teraz zapisujemy nasze pole dodatkowe umieszczone w eleganckim pudełku (metabox).
add_action( 'save_post', 'zapisz_skladniki' );
Gdy produkt jest zapisywany zapisz również nasze dodatkowe pole
function zapisz_skladniki( $post_id ) { // Sprawdzamy czy jest autozapis // Jesli nasz produkt nie był aktualizowany to nic nie robimy if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; // Sprawdzamy uprawnienia if ( ( isset ( $_POST['post_type'] ) ) && ( 'product' == $_POST['post_type'] ) ) { if ( ! current_user_can( 'edit_post', $post_id ) ) { return; } } else { if ( ! current_user_can( 'edit_product', $post_id ) ) { return; } } // OK, skoro mamy uprawnienia do zapisu sprawdzamy czy mamy jakieś dodatkowe dane do zapisu if ( isset ( $_POST['skladniki_content'] ) ) { update_post_meta( $post_id, 'skladniki_content', $_POST['skladniki_content'] ); } }
Gdzie lądują nasze dane i jak je odczytać? O tym może w przykładzie dodawania kolejnej zakładki (tabs) na podstronie produktu.