it-swarm.com.de

get_terms zeigt bei Angabe weder product_cat noch andere benutzerdefinierte Taxonomien an

Ich frage mich, ob Sie vielleicht einige Ideen zu diesem Problem haben. Ich habe tagelang gegoogelt, kann es aber nicht herausfinden.

Hier bin ich:

Ich habe eine Meta-Box für den Woocommerce-Beitragstyp "Produkte". In der Meta-Box befindet sich ein 'type' = > 'select', den ich mit einer Liste aller verfügbaren 'taxonomy' = > 'product_cat' füllen möchte.

Ich kann das Auswahlfeld zum Ausfüllen und Arbeiten mit den Standardpostkategorien 'taxonomy' = > 'category' mithilfe des folgenden Codes verwenden:

function product_cats() {
$options = array();

$categories = get_terms( array( 'taxonomy' => 'category' ) );
foreach( $categories as $category ) {
    $options[$category->term_id] = array(
        'label' => $category->name,
        'value' => $category->slug
    );
}
// return array('options'=>$options);
return $options;
}

Es fällt alles auseinander, wenn ich versuche, ‘taxonomy' = > ‘product_cat’ oder eine andere benutzerdefinierte Taxonomie zu verwenden, die ich habe.

Ich dachte, das Problem sei, dass ich versuche, auf die benutzerdefinierte Taxonomie zuzugreifen, bevor sie registriert wird. Daher habe ich einige Deklarationen/Aufrufe in meiner function.php-Datei (diejenigen, die CPT, Meta-Boxen und woocommece aufrufen) ausgetauscht, um sie möglicherweise zu ändern die Reihenfolge, in der die Dinge laufen, aber kein Glück.

ABER, basierend auf der Frage und Antwort unten, kann ich jetzt bestätigen, dass die Funktion alle Begriffe über Taxonomien hinweg 'sehen' und anzeigen kann. Wenn ich den 'taxonomy => von den Argumenten ausschließe, werden Begriffe aus allen benutzerdefinierten Beitragstypen und Taxonomien zurückgegeben.

Idealerweise würde die Grundfunktion lauten:

function product_cats() {
$options = array();

$categories = get_terms( array( 'taxonomy' => 'product_cat' ) );
foreach( $categories as $category ) {
    $options[$category->term_id] = array(
        'label' => $category->name,
        'value' => $category->slug
    );
}
// return array('options'=>$options);
return $options;
}

Fragen Sie sich nur, ob Sie allgemeine Gedanken hatten? Ich weiß, es ist schwierig, ohne die gesamte Codebasis zu sehen, aber ich dachte, es wäre eine Frage wert.

Wordpress Version 4.7.2

Woocommerce Version 2.6.14

UPDATE:

Langsam versuche ich mein Problem zu lokalisieren.

Es scheint, dass auf 'product_cat' doch zugegriffen werden kann (gut), aber es spuckt ein Array aus, das nicht richtig angezeigt wird.

Das verwirrt mich, als ob ich einfach get_terms() ohne Parameter verwende oder 'taxonomy' => 'category' spezifiziere, der obige Code funktioniert einwandfrei

Die anderen Teile des Codes, mit denen ich arbeiten muss, sind:

Das Array, in dem die Liste der Optionen gespeichert werden soll

    array(  
        'label'=> 'Collections',
        'desc'  => 'Select the collection you would like to display',
        'id'    => $prefix.'collection',
        'type'    => 'select',  
        'options' => product_cats()
),

der Code, der die Auswahlliste generiert (wird für andere Metafelder verwendet)

// select
case 'select':
echo '<select name="'.$field['id'].'" id="'.$field['id'].'">';
foreach ($field['options'] as $option) {
    echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';
}
echo '</select><br /><span class="description">'.$field['desc'].'</span>';
break;

Ich habe keine Probleme mit anderen Metafeldern, die funktionieren oder angezeigt werden, einschließlich Auswahllisten.

Ich möchte lieber nicht die gesamte Meta-Box mit all ihren Feldern neu schreiben, also versuche ich, mit dem zu arbeiten, was ich gerade habe.

2

Für mein ganzes Leben möchte ich wirklich, dass das richtig funktioniert . Für das Leben von mir kann ich die Integration nicht herausfinden.

Zuvor hatte ich mir wp_dropdown_categories() angesehen und dachte, es sei eine bessere (und einfachere) Lösung. Ich landete mit dem oben genannten Problem, weil ich nicht herausfinden konnte, wie es mit der vorhandenen Meta-Box-Syntax funktioniert.

Im Moment habe ich mich für das unten stehende temporäre Update entschieden. Es ist nicht ideal und sicherlich nicht der beste Weg, aber es ermöglicht mir, die Werte in den Vorlagen aufzurufen, die dieses Feld verwenden.

// Wrap all categories in a function
function product_cats() {
    $output = array();
    $categories = get_terms( array(
    'orderby'      => 'name',
    'pad_counts'   => false,
    'hierarchical' => 1,
    'hide_empty'   => true,
    ) );
    foreach( $categories as $category ) {
        if ($category->taxonomy == 'product_cat' ) {
            $output[$category->slug] = array(
                'label' => $category->name,
                'value' => $category->slug
            );
        }
    }
    //return array('options'=>$output);
    return $output;
}

Ich werde mehr aktualisieren, wenn ich weitergehe.

1

Dies wird wahrscheinlich nicht behoben, wollte aber mitteilen: Ich bin heute auf dasselbe Problem gestoßen, und dies wurde dadurch verursacht, dass ich keine Produkte in meinen Kategorien hatte. Wenn dies auch für Sie der Fall ist, stellen Sie sicher, dass Sie 'hide_empty' => false hinzufügen.

Das gesagt. Wenn Sie get_terms() ohne Argumente ausführen. Was ist die Ausgabe?

0
Marinus Klasen

Sie verwenden möglicherweise eine alte Version von WordPress (vor 4.5).

Vor WordPress 4.5.0 war der erste Parameter von get_terms () eine Taxonomie oder eine Liste von Taxonomien, und seit 4.5.0 sollten Taxonomien über das Argument 'taxonomy' im Array $ args übergeben werden (das, was Sie tun, sollte es sein) so arbeiten).

Alle Details zu diesen Änderungen finden Sie auf der Referenzseite get_terms () .

UPDATE: Entschuldigung, ich überprüfe meinen Code und verwende get_categories () nicht get_terms, und dieses richtige get_terms () funktioniert nicht!

hier ist ein funktionierendes Beispiel, um alle meine product_cat aufzulisten

$product_categories = get_categories( array(
    'taxonomy'     => 'product_cat',
    'orderby'      => 'name',
    'pad_counts'   => false,
    'hierarchical' => 1,
    'hide_empty'   => false
) );

Ich hoffe es hilft !

0
Benoti

Hier ist ein voll funktionsfähiges Beispiel für eine Meta-Box, in der ein Auswahlfeld für eine Produktkategorie angezeigt wird. Das Meta-Feld wird auf dem Produktposttyp angezeigt.

add_action( 'add_meta_boxes', 'wpse256897_add_meta_box' );
add_action( 'save_post',     'wpse256897_save' );
/**
 * Adds the meta box container.
 */
function wpse256897_add_meta_box( $post_type ) {
    // Limit meta box to certain post types.
    $post_types = array( 'product' );

    if ( in_array( $post_type, $post_types ) ) {
        add_meta_box(
            'product_cat_selection',
             __( 'Product Category Selection', 'textdomain' ),
             'wpse256897_render_meta_box_content',
             $post_type,
             'advanced',
             'high'
        );
    }
}

/**
 * Save the meta when the post is saved.
 *
 * @param int $post_id The ID of the post being saved.
 */
function wpse256897_save( $post_id ) {
    /*
     * We need to verify this came from the our screen and with proper authorization,
     * because save_post can be triggered at other times.
     */

    // Check if our nonce is set.
    if ( ! isset( $_POST['myplugin_inner_custom_box_nonce'] ) ) {
            return $post_id;
    }

    $nonce = $_POST['myplugin_inner_custom_box_nonce'];

    // Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $nonce, 'myplugin_inner_custom_box' ) ) {
            return $post_id;
    }

    /*
     * If this is an autosave, our form has not been submitted,
     * so we don't want to do anything.
     */
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
            return $post_id;
    }

    // Check the user's permissions.
    if ( 'page' == $_POST['post_type'] ) {
            if ( ! current_user_can( 'edit_page', $post_id ) ) {
                    return $post_id;
            }
    } else {
            if ( ! current_user_can( 'edit_post', $post_id ) ) {
                    return $post_id;
            }
    }

    /* OK, it's safe for us to save the data now. */

    // Sanitize the user input.
    $mydata = sanitize_text_field( $_POST['product_cat_selection'] );

    // Update the meta field.
    update_post_meta( $post_id, '_product_cat_selection', $mydata );
}

/**
 * Render Meta Box content.
 *
 * @param WP_Post $post The post object.
 */
function wpse256897_render_meta_box_content( $post ) {
    // Add an nonce field so we can check for it later.
    wp_nonce_field( 'myplugin_inner_custom_box', 'myplugin_inner_custom_box_nonce' );

    // Use get_post_meta to retrieve an existing value from the database.
    $current_product_cat = get_post_meta( $post->ID, '_product_cat_selection', true );

    // Display the form, using the current value.
    $product_cats = wpse256897_product_cats();
    if ( !empty ( $product_cats ) ) {
        echo '<select name="product_cat_selection" id="product_cat_selection">';
        foreach ( $product_cats as $product_cat_id => $product_cat ) { ?>
            <option value="<?php echo esc_attr( $product_cat['value'] ); ?>" <?php if ( isset ( $current_product_cat ) ) selected( $current_product_cat, $product_cat['value'] ); ?>><?php echo esc_html( $product_cat['label'] ); ?></option><?php
        }
        echo '</select>';
    }
}               

function wpse256897_product_cats() {
    $options = array();
    $categories = get_terms( array( 'taxonomy' => 'product_cat' ) );

    foreach( $categories as $category ) {
        $options[$category->term_id] = array(
                'label' => $category->name,
                'value' => $category->slug
        );
    }

    return $options;
}

Dies ist nicht das eleganteste Beispiel (die Namenskonventionen könnten besser sein). Es wurde schnell aus den bereitgestellten Notizen auf der Meta-Box-Referenzseite hinzufügen angepasst, zeigt jedoch, dass wpse256897_product_cats() die Produktkategorien erhält und dass sie in einem Auswahlfeld auf der Produktseite innerhalb einer Meta gespeichert und angezeigt werden können Box.

Ich möchte auch hinzufügen, dass es sich lohnen könnte, die Funktion wp_dropdown_categories() auszuprobieren. Was trotz seines Namens auch mit benutzerdefinierten Taxonomien funktioniert. Dies erspart Ihnen das Erstellen eines eigenen Kategorie-Dropdown-Markups.

Update: Die Struktur des von der Funktion product_cats() zurückgegebenen Arrays scheint nicht mit Ihrer Meta-Box-Implementierung zu jubeln. Beachten Sie, dass ich in meinem obigen Beispiel diese Zeile zum Durchlaufen der Kategorien beim Generieren der Optionen für das select-Element verwendet habe:

foreach ( $product_cats as $product_cat_id => $product_cat ) { ?>

Dies liegt daran, dass $product_cats ein assoziatives Array von Kategorie-IDs ist, die jeweils ein anderes Array enthalten, das die label und die slug für jede Kategorie-ID enthält.

Es sieht so aus, als könnten Sie möglicherweise diese alternative Version von product_cats() verwenden, die die $ options-Rückgabewerte so formatiert, dass sie mit Ihrem Metabox-Code kompatibel sind:

function product_cats_alternate() {
    $options = array();

    $categories = get_terms( array( 'taxonomy' => 'product_cat' ) );
    foreach( $categories as $category ) {
            $options[] = array(
              'label' => $category->name,
              'value' => $category->slug
            );
    }
    return $options;
}
0
Dave Romsey