WordPress-无法在条件语句中创建分类法

时间:2019-06-06 23:14:51

标签: php wordpress

我的目标是在插件中提取项目中的所有帖子/页面/自定义帖子类型,并创建一个自定义分类法(如果不存在)。每当插件进入if语句内部时,php就会在页面上停止运行。如您在foreach语句中看到的,我回显了帖子类型名称和与其关联的分类法。

如果分类法不存在,我只想在公开可用的帖子类型上创建自定义分类法。

只要我将变量替换为正确的帖子类型,我就能运行functions.php文件中if语句内部的分类法代码。

我也尝试不使用add_action('init','custom_taxo_cpt_taxonomy',1);只需在与add_action('init','custom_taxo_cpt_taxonomy',1);相同的行上通过custom_taxo_cpt_taxonomy()直接调用该函数即可。

echos / var_dumps能够为我提供相关的帖子类型和分类法,而在页面上没有问题,因此我知道在页面上可以很好地做到这一点。

<?php
$args = array(
    'public'   => true,
);

$output = 'names';
$operator = 'and';

$post_types = get_post_types( $args, $output, $operator ); 

foreach ( $post_types  as $post_type ) {
    $cpt_taxo_ar = get_object_taxonomies($post_type);
    $cpt_taxo_ar = array_shift($cpt_taxo_ar);
    echo '<p>' . $post_type . ' category: ' . $cpt_taxo_ar . '</p>';
    if($cpt_taxo_ar != $post_type . '_custom_taxo'){
        echo $post_type . '_custom_taxo';

        // Register CustomTaxo Tags Taxonomy
        function custom_taxo_cpt_taxonomy() {

            $labels = array(
                'name'                       => _x( 'CustomTaxo Tags', 'CustomTaxo Tags', 'custom_taxo_domain' ),
                'singular_name'              => _x( 'CustomTaxo Tag', 'CustomTaxo Tag', 'custom_taxo_domain' ),
                'menu_name'                  => __( 'CustomTaxo Tags', 'custom_taxo_domain' ),
                'all_items'                  => __( 'All Tags', 'custom_taxo_domain' ),
                'parent_item'                => __( 'Parent Tag', 'custom_taxo_domain' ),
                'parent_item_colon'          => __( 'Parent Tag:', 'custom_taxo_domain' ),
                'new_item_name'              => __( 'New Tag Name', 'custom_taxo_domain' ),
                'add_new_item'               => __( 'Add New Tag', 'custom_taxo_domain' ),
                'edit_item'                  => __( 'Edit Tag', 'custom_taxo_domain' ),
                'update_item'                => __( 'Update Tag', 'custom_taxo_domain' ),
                'view_item'                  => __( 'View Tag', 'custom_taxo_domain' ),
                'separate_items_with_commas' => __( 'Separate items with commas', 'custom_taxo_domain' ),
                'add_or_remove_items'        => __( 'Add or remove tags', 'custom_taxo_domain' ),
                'choose_from_most_used'      => __( 'Choose from the most used', 'custom_taxo_domain' ),
                'popular_items'              => __( 'Popular tags', 'custom_taxo_domain' ),
                'search_items'               => __( 'Search tags', 'custom_taxo_domain' ),
                'not_found'                  => __( 'Not Found', 'custom_taxo_domain' ),
                'no_terms'                   => __( 'No items', 'custom_taxo_domain' ),
                'items_list'                 => __( 'Tags list', 'custom_taxo_domain' ),
                'items_list_navigation'      => __( 'Tags list navigation', 'custom_taxo_domain' ),
            );

            $args = array(
                'labels'                     => $labels,
                'hierarchical'               => false,
                'public'                     => true,
                'show_ui'                    => true,
                'show_admin_column'          => true,
            );

            register_taxonomy( $post_type . '_custom_taxo', 'page', $args );

        } // end taxo function
            add_action( 'init', 'custom_taxo_cpt_taxonomy', 1 );
    } //end for loop
}
?>

1 个答案:

答案 0 :(得分:0)

根据文档:

add_action( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 )`

要解决此问题:"Cannot redeclare custom_taxo_cpt_taxonomy()"

custom_taxo_cpt_taxonomy必须为callable,因此在避免名称声明问题的循环中,可以这样使用匿名函数:

$custom_taxo_cpt_taxonomy = function() { ... }

最终匿名不起作用,因为WordPress在call_user_func_array的{​​{3}}中使用apply_filters,而不是$myCallback();

编辑:函数在循环外不匿名

<?php
function custom_taxo_cpt_taxonomy($params) {
  register_taxonomy( $params['post_type'] . '_custom_taxo', 'page', $params['args'] );
} // end taxo function


foreach ( $post_types  as $post_type ) {
  $cpt_taxo_ar = get_object_taxonomies($post_type);
  $cpt_taxo_ar = array_shift($cpt_taxo_ar);
  echo '<p>' . $post_type . ' category: ' . $cpt_taxo_ar . '</p>';

  if($cpt_taxo_ar != $post_type . '_custom_taxo'){
    echo $post_type . '_custom_taxo';

    // Register CustomTaxo Tags Taxonomy
    // function custom_taxo_cpt_taxonomy() { <= issue here
    // $custom_taxo_cpt_taxonomy = function() { <= other issue
    $labels = array(
      'name'                       => _x( 'CustomTaxo Tags', 'CustomTaxo Tags', 'custom_taxo_domain' ),
      'singular_name'              => _x( 'CustomTaxo Tag', 'CustomTaxo Tag', 'custom_taxo_domain' ),
      'menu_name'                  => __( 'CustomTaxo Tags', 'custom_taxo_domain' ),
      'all_items'                  => __( 'All Tags', 'custom_taxo_domain' ),
      'parent_item'                => __( 'Parent Tag', 'custom_taxo_domain' ),
      'parent_item_colon'          => __( 'Parent Tag:', 'custom_taxo_domain' ),
      'new_item_name'              => __( 'New Tag Name', 'custom_taxo_domain' ),
      'add_new_item'               => __( 'Add New Tag', 'custom_taxo_domain' ),
      'edit_item'                  => __( 'Edit Tag', 'custom_taxo_domain' ),
      'update_item'                => __( 'Update Tag', 'custom_taxo_domain' ),
      'view_item'                  => __( 'View Tag', 'custom_taxo_domain' ),
      'separate_items_with_commas' => __( 'Separate items with commas', 'custom_taxo_domain' ),
      'add_or_remove_items'        => __( 'Add or remove tags', 'custom_taxo_domain' ),
      'choose_from_most_used'      => __( 'Choose from the most used', 'custom_taxo_domain' ),
      'popular_items'              => __( 'Popular tags', 'custom_taxo_domain' ),
      'search_items'               => __( 'Search tags', 'custom_taxo_domain' ),
      'not_found'                  => __( 'Not Found', 'custom_taxo_domain' ),
      'no_terms'                   => __( 'No items', 'custom_taxo_domain' ),
      'items_list'                 => __( 'Tags list', 'custom_taxo_domain' ),
      'items_list_navigation'      => __( 'Tags list navigation', 'custom_taxo_domain' )
    );

    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => false,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true
    );

    $params = array(
      'post_type' => $post_type,
      'args' => $args
    );

    // Pass callable not anonymous function
    add_action( 'init', array('custom_taxo_cpt_taxonomy', $params), 1);
  } //end for loop
}
?>

编辑:重要

因此下面的代码不起作用syntax error, unexpected 'add_action' (T_STRING).

<?php
$args = array(
  'public' => true
);

$output = 'names';
$operator = 'and';

$post_types = get_post_types( $args, $output, $operator ); 

foreach ( $post_types  as $post_type ) {
    $cpt_taxo_ar = get_object_taxonomies($post_type);
    $cpt_taxo_ar = array_shift($cpt_taxo_ar);
    echo '<p>' . $post_type . ' category: ' . $cpt_taxo_ar . '</p>';
    if($cpt_taxo_ar != $post_type . '_custom_taxo'){
        echo $post_type . '_custom_taxo';

        // Register CustomTaxo Tags Taxonomy
        // function custom_taxo_cpt_taxonomy() { <= issue here
        // Create anonymous function
        $custom_taxo_cpt_taxonomy = function() {

            $labels = array(
                'name'                       => _x( 'CustomTaxo Tags', 'CustomTaxo Tags', 'custom_taxo_domain' ),
                'singular_name'              => _x( 'CustomTaxo Tag', 'CustomTaxo Tag', 'custom_taxo_domain' ),
                'menu_name'                  => __( 'CustomTaxo Tags', 'custom_taxo_domain' ),
                'all_items'                  => __( 'All Tags', 'custom_taxo_domain' ),
                'parent_item'                => __( 'Parent Tag', 'custom_taxo_domain' ),
                'parent_item_colon'          => __( 'Parent Tag:', 'custom_taxo_domain' ),
                'new_item_name'              => __( 'New Tag Name', 'custom_taxo_domain' ),
                'add_new_item'               => __( 'Add New Tag', 'custom_taxo_domain' ),
                'edit_item'                  => __( 'Edit Tag', 'custom_taxo_domain' ),
                'update_item'                => __( 'Update Tag', 'custom_taxo_domain' ),
                'view_item'                  => __( 'View Tag', 'custom_taxo_domain' ),
                'separate_items_with_commas' => __( 'Separate items with commas', 'custom_taxo_domain' ),
                'add_or_remove_items'        => __( 'Add or remove tags', 'custom_taxo_domain' ),
                'choose_from_most_used'      => __( 'Choose from the most used', 'custom_taxo_domain' ),
                'popular_items'              => __( 'Popular tags', 'custom_taxo_domain' ),
                'search_items'               => __( 'Search tags', 'custom_taxo_domain' ),
                'not_found'                  => __( 'Not Found', 'custom_taxo_domain' ),
                'no_terms'                   => __( 'No items', 'custom_taxo_domain' ),
                'items_list'                 => __( 'Tags list', 'custom_taxo_domain' ),
                'items_list_navigation'      => __( 'Tags list navigation', 'custom_taxo_domain' )
            );

            $args = array(
                'labels'                     => $labels,
                'hierarchical'               => false,
                'public'                     => true,
                'show_ui'                    => true,
                'show_admin_column'          => true
            );

            register_taxonomy( $post_type . '_custom_taxo', 'page', $args );

        } // end taxo function

        // Pass callable anonymous function
        add_action( 'init', $custom_taxo_cpt_taxonomy, 1 );
    } //end for loop
}
?>
数组末尾的

,创建一个额外的空字段。