Liuer Box
·
A custom fields framework with a visual builder and clean, native storage. Zero plugin dependencies.
Liuer Box lets you build custom fields for WordPress with a visual field-group builder, while keeping data stored cleanly in native post/term/user meta and options.
- Visual builder — create Field Groups, add fields, drag to reorder, choose where they appear. No code required.
- Clean, native storage — single fields are stored in one native meta row; complex fields (repeater / gallery / link) are stored as a single JSON row instead of many rows; global options are consolidated into a single
liuer_box_optionsrow. Your database stays small. - 23 field types — text, textarea, number, email, url, password, range, select, checkbox, radio, button group, true/false, WYSIWYG, image, gallery, file, oEmbed, HTML Embed, color, link, date/time, post object (pick one or more posts of a chosen post type), and a nested Repeater, plus Tab and Message layout fields.
- Locations — Options Pages, Post types (meta boxes), Taxonomy terms, User profiles, and Page Templates.
- Repeater with nesting — drag-sort rows, collapse, min/max, dynamic row labels, repeaters inside repeaters.
- Conditional logic — show/hide a field based on another field’s value, evaluated both client-side and server-side.
- Field width & tabs — lay fields out in columns and group them into tabs.
- Multilingual ready — per-post/term/user fields follow translations naturally; global option fields can use language-scoped values for Polylang/WPML, with Polylang string registration when available.
- Developer friendly — read values with
liuer_option(),liuer_field(),liuer_term(),liuer_user(); write them withliuer_update_field(),liuer_update_term(),liuer_update_user(),liuer_update_option(); register groups in code withliuer_box_register().
Reading values in your theme
The getters return RAW values (use them for logic, arrays, attachment IDs and HTML fields). Always escape on output:
$accent = liuer_option( 'accent' ); // Options page value
$logo = liuer_field( 'logo', null, $post_id ); // Post meta value (attachment ID)
$color = liuer_term( 'color', $term_id ); // Term meta value
$phone = liuer_user( 'phone', $user_id ); // User meta value
echo esc_html( liuer_field( 'subtitle' ) );
echo wp_get_attachment_image( liuer_field( 'logo' ), 'large' );
foreach ( (array) liuer_field( 'slides' ) as $row ) {
echo esc_html( $row['title'] );
}
Writing values from code
Setters mirror the getters and store in the same native format (arrays become one JSON row). They store the value AS GIVEN, so sanitize your input first:
liuer_update_field( 'subtitle', sanitize_text_field( $text ), $post_id ); // post meta
liuer_update_field( 'logo', absint( $attachment_id ) ); // current post
liuer_update_field( 'slides', array( // array -> JSON row
array( 'title' => 'One' ),
array( 'title' => 'Two' ),
), $post_id );
liuer_update_term( 'color', '#025098', $term_id ); // term meta
liuer_update_user( 'phone', $phone, $user_id ); // user meta
liuer_update_option( 'accent', '#2271b1' ); // options page
Safe output helpers (auto-escaping)
Optional convenience helpers that echo already-escaped output, so you don’t have to remember the right escaper:
liuer_e( 'subtitle' ); // echo esc_html() of a post field
liuer_attr_e( 'data_id' ); // echo esc_attr()
liuer_url_e( 'website' ); // echo esc_url()
liuer_img( 'logo', 'large' ); // echo a safe <img> from an attachment ID
liuer_wysiwyg( 'about' ); // echo with WordPress content filters
liuer_embed( 'map_embed' ); // echo sanitized iframe/embed HTML
liuer_option_e( 'tagline' ); // same family for options
liuer_option_attr_e( 'accent' );
liuer_option_url_e( 'fanpage' );
liuer_option_img( 'logo', 'medium' );
liuer_option_embed( 'map_embed' );
