【问题标题】:Change labels of custom post type via child theme通过子主题更改自定义帖子类型的标签
【发布时间】:2013-04-12 09:50:09
【问题描述】:

我有一个父 wordpress 主题,它使用“投资组合”的自定义帖子类型,但我想将其更改为“属性”。我希望将所有上下文元素更改为显示“属性”,例如“显示属性”、“添加新属性”、“删除属性”等。我知道我可以通过更新父主题来做到这一点,但是如果可以避免的话,我宁愿不这样做。

我找到了这个帖子:https://wordpress.stackexchange.com/questions/19240/can-i-change-a-custom-post-type-label-from-a-child-theme

不幸的是,我对 PHP 的了解不够,无法编写自己的函数并进行更改。有人可以帮我解决这个问题吗?我有点卡住了。

我觉得这对于 php 开发人员来说很简单。我只是不知道该怎么做。

【问题讨论】:

    标签: wordpress wordpress-theming custom-post-type


    【解决方案1】:

    要重命名帖子类型标签,我们需要操纵全局$wp_post_types。请注意,帖子类型是portfolio,并且标签只是虚拟文本。

    add_action( 'init', 'object_label_so_16097216', 0 );
    
    function object_label_so_16097216()
    {
        global $wp_post_types;
        $labels = &$wp_post_types['portfolio']->labels; // <-- adjust CPT
    
        $labels->name = 'name'; // <-- adjust from here on
        $labels->singular_name = 'singular_name';
        $labels->add_new      = 'add_new';
        $labels->add_new_item = 'add_new';
        $labels->edit_item = 'edit_item';
        $labels->new_item = 'name';
        $labels->view_item = 'view_item';
        $labels->search_items = 'search_items';
        $labels->not_found = 'not_found';
        $labels->not_found_in_trash = 'not_found_in_trash';
    }
    

    之后,我们仍然需要更改菜单项标签。在这里,我使用了一个辅助函数来获取 CPT 菜单项的确切位置。标签又是虚拟文本。

    add_action( 'admin_menu', 'menu_label_so_16097216' , 0 );
    
    function menu_label_so_16097216()
    {
        global $menu, $submenu;
    
        $cpt_link = 'edit.php?post_type=portfolio'; // <-- adjust CPT
        $position = b5f_recursive_array_search( $cpt_link, $menu );
    
        $menu[$position][0] = 'name'; // <-- adjust from here on
        $submenu[$cpt_link][5][0] = 'name';
        $submenu[$cpt_link][10][0] = 'add_new';       
    }
    
    function b5f_recursive_array_search( $needle, $haystack ) 
    {
        foreach( $haystack as $key => $value ) 
        {
            $current_key = $key;
            if( 
                $needle === $value 
                OR ( 
                    is_array( $value )
                    && b5f_recursive_array_search( $needle, $value ) !== false 
                )
            ) 
            {
                return $current_key;
            }
        }
        return false;
    }
    

    只需将所有这些代码放在孩子的functions.php 中,调整 CPT 和标签,就可以了。

    基于this WordPress Answer

    【讨论】:

    • 效果很好。唯一奇怪的是管理菜单中的名称没有改变。我在$menu[$position][0] = 'Properties'; 中将其设置为“属性”,但它仍显示为“组合”有什么想法吗?
    • $position 的变量可以关闭吗?我应该手动调整吗?
    • 你必须检查变量:var_dump($menu);wp_die();。由于菜单结构并不总是相同并且没有可用的钩子,因此必须对这种 hack 进行微调。
    • 嗯,好的。我会看看我能不能解决这个问题。感谢您的帮助!
    【解决方案2】:

    在回复 Jeremy Miller 的回答时,您不必循环通过管理菜单来更改标签。标签的完整列表实际上是:

    'name'
    'singular_name'
    'menu_name'
    'name_admin_bar'
    'all_items'
    'add_new'
    'add_new_item'
    'edit_item'
    'new_item'
    'view_item'
    'search_items'
    'not_found'
    'not_found_in_trash'
    'parent_item_colon'
    

    看看https://codex.wordpress.org/Function_Reference/register_post_type#Arguments

    由于您可以指定“menu_name”,因此在 Jeremy 指定的菜单项中添加额外的钩子和循环是没有用的。

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多