Frage

Fall:

Ich habe eine Reihe von Klassen erhalten, die Formularfelder basierend auf Daten aus einem Eingabearray erstellen. Die Klasse kann die folgenden Arten von Formularfeldern erstellen:

  • Eingabe (grundlegend, versteckt, Passwort)
  • Textbereich
  • Radio
  • Kontrollkästchen
  • auswählen
  • Farbwähler
  • Datumsauswahl
  • Datei-Upload

BEARBEITEN: Die Klasse verwendet wp_register_script/_style & wp_enqueue_script/_style So laden Sie die Skripte und Stile. Die Funktionen, die die Aktionen enthalten, sind in der Klasse wie folgt angeregt: add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue' ) );.

Beispiel:

(Innen functions.php)

// meta box callback function
function test_meta_box_cb()
{   
    $input_args = array(
         'type'         => 'color'
        ,'id'           => 'color-id'
        ,'label'        => 'Input Colorpicker Label'
        ,'opt_name'     => 'abc_xyz'
        ,'value'        => '009ee0'
     );
    new FormClass( $input_args, true );
}
// add the meta box
function add_test_meta_box()
{
    add_meta_box( 'test_box', __('TestBox'), 'test_meta_box_cb', 'post', 'advanced', 'high' );
}
add_action( 'add_meta_boxes', 'add_test_meta_box' );

Problem:

Auf diese Weise mein Ruf für wp_enqueue_script & wp_enqueue_style funktioniert nicht. Ich lasse die Formfelder aufgelegt, aber keine Skripte oder Stile.

Situation & Backcraceing des Problems:

Bisher konnte ich das Problem der WordPress -Kernarchitektur aufspüren:

  • WP fragt nicht, was in der Rückruffunktion passiert, bis do_action('add_meta_boxes', $post_type, $post) Holen Sie sich an (im Inneren edit-form-advanced.php).
  • Dieser Anruf passiert lange danach Admin-Header.php wurde genannt (was enthält do_action('admin_enqueue_scripts', $hook_suffix);).
  • Daher kann das Skript und der Stil nicht geladen werden (wenn ich mich nicht irre).

Frage:

  1. Wie könnte ich Stile laden, bevor die Felder der Meta -Box -Form angerufen werden?
  2. Wie könnte ich es vermeiden, immer wieder dasselbe Stylesheet zu wiederholen - ich möchte verwenden? wp_enqueue_style & wp_register_style?

Ich bin offen für Antworten, einschließlich derer, die mich zwingen, meine Klassenarchitektur neu zu schreiben.

Notiz: Ich muss diese Klasse in vielen verschiedenen Szenarios verwenden, damit sie mit dem schließen kann add_meta_box Funktion ist nicht gut. Ich bin kurz davor, eine Abstraktionsschicht zu erstellen, die den Aufruf für den Metabox und den Stil/Skript -Teil teilt, aber warum sollte ich eine weitere Ebene über einer Kernfunktion hinzufügen?

War es hilfreich?

Lösung

Ihr Problem ist das Hinzufügen der Skripte, Stile, Styles Innerhalb die Klasse und weil die Klasseninstanz erstellt wird, wenn der Haken ist add_meta_box wird gefeuert, zu dieser Zeit die wp_enqueue_script/style sind bereits fertig.

Eine Lösung für Sie ist das Hinzufügen der Skripte und Stile außen Die Funktion und die Klasse. Und weil Metaboxen nur bei Bearbeitungsseiten verwendet werden, können Sie wie folgt tun:

// the editing pages are actually post.php and post-new.php
add_action('admin_print_styles-post.php', 'custom_js_css');
add_action('admin_print_styles-post-new.php', 'custom_js_css');

function custom_js_css() {
    wp_enqueue_style('your-meta-box', $base_url . '/meta-box.css');
    wp_enqueue_script('your-meta-box', $base_url . '/meta-box.js', array('jquery'), null, true);
}

Eigentlich habe ich a geschrieben Meta -Box -Klasse für WP, das verwendet einen anderen Ansatz. Anstatt die Form von Form für Formfelder wie Sie zu schreiben, ist meine Klasse ein Wrapper für Metaboxen. Wenn Sie an interessiert sind, lohnt es sich, einen Blick darauf zu werfen.

Andere Tipps

Du solltest dir wirklich Skripte an die wp_enqueue_scripts Aktion und Ihre Stile an die wp_print_styles Aktion. Führen Sie in Ihren Funktionen eine Überprüfung durch, um sicherzustellen wp_enqueue_script() oder wp_enqueue_style().

Zum Beispiel habe ich in einem meiner Plugins:

public static function enqueue_scripts_and_styles() {
    if( is_admin() ) {
        wp_enqueue_script( 'media-upload' );
        wp_enqueue_script( 'thickbox' );
        wp_enqueue_style( 'thickbox' );
    } else {
        wp_enqueue_style( 'wp-publication-archive-frontend', WP_PUB_ARCH_INC_URL . '/front-end.css', '', '2.0', 'all' );
    }
}

Und ich hea das an init (Die kurz vor allen anderen Skripten und Stilen feuert).

In aktueller Form Ihr Code Dumbs Down -Objekt zum Funktionsaufruf (erstellen Sie etwas, tun Sie etwas, sterben). Eine solche Verwendung wird nicht tun, wenn Sie möchten, dass Objekt etwas unternimmt, bevor dieses Objekt erstellt und zerstört wird.

Anstatt Objekt in den Metabox -Inhalten zu erstellen, würde ich folgen:

  1. Erstellen Sie Objekt einige Zeit früh.
  2. Verwenden Sie die Methode des Objekts, um mit Skripten umzugehen.
  3. Verwenden Sie die Methode eines anderen Objekts als Meta -Box -Rückruf.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top