我的目标是在插件中提取项目中的所有post/pages/custom post类型,如果不存在,则创建一个自定义分类法。每当插件进入if语句时,php就会停止在页面上运行。正如您在foreach语句中看到的,我回显post类型名和与之相关的分类法。
如果分类法不存在,我只想在公共可用的post类型上创建自定义分类法。
只要用正确的post类型替换变量,我就可以运行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_转储可以在页面上无问题地为我提供相关的post类型和分类,所以我知道在页面上这是很好的。

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

最佳答案

根据文件:

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() { ... }

最后,anonymous不起作用,因为wordpress在class-wp-hook中使用call_user_func_array而不是像apply_filters这样的东西。
编辑:函数在循环外不是匿名的
<?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
}
?>

编辑:重要
所以下面的代码不起作用:$myCallback();
<?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
}
?>

syntax error, unexpected 'add_action' (T_STRING).在数组末尾创建一个额外的空字段。

关于php - WordPress-无法在条件语句中创建分类法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56486160/

10-15 01:41