指定GET_TERMS时,不会显示PRODUCT_CAT或任何其他自定义分类

时间:2017-02-17 作者:Kevin Van Lierop

想知道你是否对这个问题有一些想法。我在谷歌上搜索了好几天,但都没找到答案。

我现在的处境是:

我有一个用于Woocommerce帖子类型“products”的元框。在元盒子里有一个\'type\' = > \'select\' 我想用所有可用\'taxonomy\' = > \'product_cat\'.

我可以使用选择框来填充和使用标准的帖子类别,\'taxonomy\' = > \'category\' 使用以下代码:

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;
}
当我尝试使用‘taxonomy\' = > ‘product_cat’ 或任何其他自定义分类法。

我认为问题是我试图在注册自定义分类法之前访问它,所以我在函数中交换了一些声明/调用。php文件(调用CPT、元框和woocommece的文件)可能会改变事物运行的顺序,但运气不佳。

但是,根据下面的问答,我现在可以确认该函数可以跨分类“查看”并显示所有术语。如果我排除\'taxonomy => 它从参数中跨自定义帖子类型和分类返回术语。

理想情况下,基本功能应为:

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;
}
只是想知道你有什么大致的想法?我知道没有看到整个代码库是很困难的,但我认为这值得一问。

Wordpress版本4.7.2

Woocommerce版本2.6.14

UPDATE:

慢慢地,我试图找出我的问题。

看来\'product_cat\' 毕竟可以访问(很好),但它吐出的数组显示不正确。

这让我很困惑,好像我只是使用get_terms() 无任何参数,或指定\'taxonomy\' => \'category\' 上面的代码可以完美地工作

我需要处理的其他代码包括:

要将选项列表转储到的数组

    array(  
        \'label\'=> \'Collections\',
        \'desc\'  => \'Select the collection you would like to display\',
        \'id\'    => $prefix.\'collection\',
        \'type\'    => \'select\',  
        \'options\' => product_cats()
),
生成选择列表的代码(用于其他元字段)

// 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;
我没有任何其他元字段的工作或显示问题,包括选择列表。

我不想重写整个元框及其所有字段,所以我正在尝试使用我目前拥有的内容。

4 个回复
最合适的回答,由SO网友:Kevin Van Lierop 整理而成

为了我的生活,我真的想让它以正确的方式工作。就我的一生而言,我无法理解这种整合。

之前我看过wp_dropdown_categories() 并认为这是一个更好(更容易)的解决方案。我最终解决了上述问题,因为我不知道如何使用现有的元框语法。

目前,我已决定使用下面的临时修复程序。这不是理想的方法,当然也不是最好的方法,但它允许我继续调用将使用此字段的模板中的值。

// 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;
}
我会在前进的过程中不断更新。

SO网友:Benoti

您可能正在运行旧版本的WordPress(4.5之前)。

在WordPress 4.5.0之前,get\\u terms()的第一个参数是分类法或分类法列表,从4.5.0开始,分类法应该通过$args数组中的“taxonomy”参数传递(您正在做的事情应该是这样)。

您将在中找到有关这些更改的所有详细信息get_terms() reference page.

UPDATE : 抱歉,我验证了我的代码,我使用的是get\\u categories()而不是get\\u terms,而正确的get\\u terms()不起作用!

下面是一个列出我的所有product\\u cat的工作示例

$product_categories = get_categories( array(
    \'taxonomy\'     => \'product_cat\',
    \'orderby\'      => \'name\',
    \'pad_counts\'   => false,
    \'hierarchical\' => 1,
    \'hide_empty\'   => false
) );
希望有帮助!

SO网友:Marinus Klasen

这可能无法解决问题,但我想与大家分享:我今天遇到了同样的问题,这是由于我的类别中没有任何产品造成的。如果您也是这样,请确保添加\'hide_empty\' => false.

也就是说。当你跑步时get_terms() 没有任何争论。输出是什么?

SO网友:Dave Romsey

下面是一个显示产品类别选择框的元框的完整工作示例。meta框将显示在product post类型上。

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;
}
这不是最优雅的例子(命名约定可能更好)。它很快根据Add Meta Box reference page, 但它确实证明了这一点wpse256897_product_cats() 获取产品类别,并且可以将其保存并显示在元框中产品页面的选择框中。

我还想补充一点,也许值得看看wp_dropdown_categories() 作用尽管名称不同,它也适用于自定义分类法。这将避免您创建自己的类别下拉标记。

Update:听起来像是product_cats() 函数未与元盒实现同步。请注意,在上面的示例中,我在为select元素生成选项时使用了这一行来循环类别:

foreach ( $product_cats as $product_cat_id => $product_cat ) { ?>
这是因为$product_cats 是类别ID的关联数组,每个类别ID包含另一个包含labelslug 对于每个类别id。

看起来您可能会使用product_cats() 它以与metabox代码兼容的方式格式化返回值$选项:

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;
}

相关推荐

WP_SET_POST_TERMS()似乎非常慢

正常吗wp_set_post_terms() 非常慢?什么时候wp_insert_post() 大约需要1秒。添加4wp_set_post_terms() 操作前7-10秒。伪代码示例:$values = [\'value_1\', \'value_2\', \'value_3\', \'value_4\', \'value_5\', \'value_6\']; $post_id = \'1234\'; $taxonomy = \'offerings\'; wp