mindkomm/(types

WordPress的定制文章类型和分类辅助类

2.5.6 2022-10-13 06:30 UTC

This package is auto-updated.

Last update: 2024-09-13 10:30:09 UTC


README

为WordPress项目提供定制文章类型和分类辅助类。

  • 通过数组符号注册定制文章类型和分类。标签将相应设置。目前支持英语、德语和荷兰语。
  • 通过参数列表更改前后端的帖子查询参数,例如,使用query选项设置自定义帖子排序。
  • 通过参数列表更改后端的帖子管理列。
  • 使用page_for_archive选项将特定页面设置为自定义文章类型的存档页面。
  • 在保存帖子时动态设置帖子短链接。

目录

安装

您可以通过Composer安装此软件包

composer require mindkomm/types

注册文章类型

<?php

/**
 * Register post types for your theme.
 *
 * Pass a an array of arrays to the registration function.
 */
add_action( 'init', function() {
    Types\Post_Type::register( [
        // Always use an English lowercase singular name to name a post type.
        'example' => [
            'name_singular' => 'Example',
            'name_plural'   => 'Examples',
            'args'          => [
                /**
                 * For a list of possible menu-icons see
                 * https://developer.wordpress.org/resource/dashicons/
                 */
                'menu_icon'    => 'dashicons-building',
                'hierarchical' => false,
                'has_archive'  => false,
                'supports'     => [
                    'title',
                    'editor',
                ],
                // Whether post is accessible in the frontend
                'public'       => false,
            ],
            'admin_columns' => [
                'date' => false,
            ],
        ],
    ] );
} );

使用args参数传递给register_post_type的参数。使用name_singularname_plural参数生成后端的标签。

您可以使用更多选项

查询

用于在前后端查询此文章类型的参数。您可以使用此功能定义排序顺序。以下是一个示例,对于文章类型event,我们希望根据自定义字段date_start的值对帖子进行排序。

'query' => [
    'meta_key' => 'date_start',
    'orderby'  => 'meta_value_num',
    'order'    => 'DESC',
],

如果您想要前后端有不同的查询,可以使用单独的frontendbackend

'query' => [
    'frontend' => [
        'meta_key' => 'date_start',
        'orderby'  => 'meta_value_num',
        'order'    => 'ASC',
    ],
    'backend'  => [
        'meta_key' => 'date_start',
        'orderby'  => 'meta_value_num',
        'order'    => 'DESC',
    ],
],

如果您只使用一个键并省略另一个键,则查询将仅应用于您的选择。

管理列

用于在后台添加和删除管理列的参数。传递一个包含列名和参数的关联数组。

以下是一个自定义文章类型event的示例。

'admin_columns' => [
    'date'       => false,
    'date_start' => [
        'title'     => 'Start Date',
        'transform' => function( $value ) {
            return date_i18n(
                get_option( 'date_format' ),
                DateTime::createFromFormat( 'Ymd', $value )->getTimeStamp()
            );
        },
    ],
    'location'   => [
        'title'      => 'Location',
        'sortable'   => true,
        'searchable' => true,
        'transform'  => function( $post_id ) {
            return get_the_title( $post_id );
        },
    ],
    'width' => [
        'title'    => 'Width',
        'sortable' => true,
        'orderby'  => 'meta_value_num',
    ],
],

以下是可以使用的参数

  • title(string) 列要使用的标题。默认为空。
  • transform(callable) 要使用的函数来显示值。这里定义的函数将获得一个$value参数,您可以对它进行转换。例如,如果您在帖子元数据中保存了一个帖子ID,您可以显示帖子的标题。默认null
  • type(string) 列的类型。可以是metaacfthumbnailimagecustom之一。默认meta
  • sortable(bool) 是否可排序。默认false
  • orderby(string) 当使用sortable参数时,按什么排序。您不需要提供meta_key参数,因为它会自动设置。默认meta_value
  • 可搜索(布尔值) 列是否可搜索。在搜索帖子列表时将包括元值。仅在使用默认类型 meta 时应用。默认 false
  • column_order(整数) 一个排序号。您可以使用此功能更改列的顺序。默认 10

如果您需要更多定义管理员列的可能性,可以使用出色的 Admin Columns 插件。

类型

type 参数定义了如何解释您的列。以下存在以下类型

  • meta
  • acf
  • 缩略图
  • 图片
  • 自定义

metaacf类型

使用 meta 类型,列名称是您想要显示的元字段名称。

您还可以使用 acf 作为类型,如果您使用高级自定义字段并希望将其过滤器应用于值。

thumbnail类型

使用此密钥显示帖子的特色图片缩略图。

'location' => [
    'thumbnail' => true,
],

您还可以设置宽度和高度。默认值是 80 × 80 像素。

'location' => [
    'thumbnail'    => [
        'width'  => 100,
        'height' => 100,
    ],
],

image类型

type 允许您显示除特色图片以外的图片。此类型还将使用列的密钥从帖子的元值中获取 附件 ID

'admin_columns' => [
    'profile_image' => [
        'title'  => 'Profile image',
        'type'   => 'image',
    ],
],

默认情况下,它将显示 thumbnail 大小。如果您想请求不同的大小,请使用 image_size 参数。

'admin_columns' => [
    'profile_image' => [
        'title'      => 'Profile image',
        'type'       => 'image',
        'image_size' => 'medium',
    ],
],

如果您想限制图片的宽度和高度,可以为 widthheight 提供像素值。

'admin_columns' => [
    'profile_image' => [
        'title'  => 'Profile image',
        'type'   => 'image',
        'width'  => 100,
        'height' => 100,
    ],
],

custom 类型

如果您想自定义一些东西,可以使用 custom 类型。如果您使用 custom 类型,您需要提供一个 value,它是一个回调函数,该函数接收帖子的 ID 作为单个参数。

在这个例子中,我们调用一个函数,从帖子的某个块中提取属性值。

'email' => [
    'title' => __( 'Email', 'theme-module-teammember' ),
    'type'  => 'custom',
    'value' => function( $post_id ) {
        return $this->get_block_attribute( $post_id, 'email' );
    },
],

现有列和列顺序

您还可以更新或隐藏现有的列。现有的列可以通过 titlecolumn_order 参数进行更新。

如果您想更改现有列的标题,请使用 title 属性。

'admin_columns' => [
    'title' => [
        'title' => 'Event title',
    ],
],

如果您想移动列,可以使用 column_order 参数。在这个例子中,我们将 date 列移动到最后。

'admin_columns' => [
    'date' => [
        'column_order' => 100,
    ],
],

默认顺序是 10。所以如果您想将缩略图这样的列移动到开头,可以使用 5

'admin_columns' => [
    'thumbnail' => [
        'column_order' => 5,
    ],
],

要隐藏现有列,请使用 false

'admin_columns' => [
    'date' => false,
],

page_for_archive

page_for_archive 选项允许您将特定页面设置为自定义帖子类型的存档页面

'event' => [
    'args' => [
        'public' => true,
    ],
    'page_for_archive' => [
        'post_id'            => get_option( 'page_for_event' ),
        'is_singular_public' => false,
    ],
],

在这个例子中,保存在 page_for_event 选项中的页面 ID 将作为 event 帖子类型的存档页面。

每当您更改此选项时,您都需要 刷新您的永久链接

幕后,Types 在注册帖子类型时使用 has_archive 选项,并设置您在 page_for_archive 选项中传递的页面的 slug。

is_singular_public

is_singular_public 选项允许您设置,此帖子类型的单个模板是否应在前端中可访问。然后单个模板请求将被重定向到存档页面。我们不能使用 publicpublicly_queryable 选项,因为那样存档页面也不会工作。

customizer_section

如果您想使 Types 在自定义调节器中注册一个选项来选择您用作存档的页面,请使用 customizer_section 参数

'event' => [
    'page_for_archive' => [
        'post_id'            => get_option( 'page_for_event' ),
        'customizer_section' => 'event',
    ],
],

使用 customizer_section,您可以定义选项应该显示在哪个自定义设置部分。这需要一个已存在的部分。这样,您可以自己决定是否为每个自定义文章类型创建一个单独的自定义设置部分,或者是否将所有自定义文章类型页面列在同一个部分中。

show_post_state

类型将在页面概览中显示您选择的页面的文章状态。如果您想禁用此功能,请使用 show_post_state 选项。

'event' => [
    'page_for_archive' => [
        'post_id'    => get_option( 'page_for_event' ),
        'show_post_state' => false,
    ],
],

在模板中使用页面

要使用该页面,您将在存档页面中使用它,您现在可以使用页面作为主要文章。

archive-event.php

$post = get_post( get_option( 'page_for_event' ) );

更新现有文章类型

更改文章类型的设置

使用 update() 函数更改现有文章类型的设置。以下是一个更改文章设置以使其在前端不可直接访问的示例。

functions.php

Types\Post_Type::update( [
    'post' => [
        'args' => [
            'public'            => false,
            'show_ui'           => true,
            'show_in_nav_menus' => true,
        ],
        'admin_columns' => [
            'date' => false,
        ],
    ],
] );

update() 函数接受一个关联数组,包含文章类型及其参数。请确保在 init 钩子之前使用此函数。

更改文章类型支持

请注意,您无法通过 update() 函数更改文章类型支持功能。要删除现有功能的支持,您必须使用 remove_post_type_support 函数。

add_action( 'init', function() {
    remove_post_type_support( 'post', 'thumbnail' );
} );

以相同的方式,如果您想添加功能,您应通过 add_post_type_support 函数来实现。

add_post_type_support( 'page', 'excerpt' );

重命名文章类型

有时您可能想要将现有文章类型重命名以更好地反映其用途。

functions.php

Types\Post_Type::rename( 'post', 'Beispiel', 'Beispiele' );

rename() 函数接受文章类型作为第一个参数,文章类型的新单数名称作为第二个参数,文章类型的新复数名称作为第三个参数。如果省略第三个参数,则第二个参数将用作复数形式。请确保在 init 钩子之前使用此函数。

这实际上是一个简写函数,用于

Types\Post_Type::update( [
    'post' => [
        'name_singular' => 'Beispiel',
        'name_plural'   => 'Beispiele',
    ],
] );

如果您只想重命名一个标签,例如菜单标签,您可以使用 post_type_labels_{$post_type} 过滤器。以下是一个更改文章菜单名称的示例

add_filter( 'post_type_labels_post', function( $labels ) {
    $labels->menu_name = 'Aktuelles';

    return $labels;
}, 11 );

更改现有文章类型的管理列设置

要更改现有文章类型(如 postpage)的管理列设置,您可以使用接受一个包含文章类型及其管理列设置的关联数组的 admin_columns() 函数。

以下是一个禁用日期、评论和作者列并添加缩略图的示例

Types\Post_Type::admin_columns( [
    'page' => [
        'date'         => false,
        'comments'     => false,
        'author'       => false,
        'thumbnail'    => [
            'width'  => 80,
            'height' => 80,
        ],
    ],
] );

注册分类

<?php

use Types\Taxonomy;

/**
 * Register taxonomies for your theme.
 *
 * Pass a an array of arrays to the registration function.
 */
add_action( 'init', function() {
    Taxonomy::register( [
        // Always use an English lowercase singular name to name a taxonomy.
        'example_tax' => [
            'name_singular'  => 'Example Category',
            'name_plural'    => 'Example Categories',
            // For which post types do you want to register this taxonomy?
            'for_post_types' => [ 'example' ],
            'args'           => [
                // Hide the meta box from the edit view
                // 'meta_box_cb' => false,
                //
                // Make it selectable in the navigation menus
                // 'show_in_nav_menus' => true,
            ],
        ],
    ] );
} );

args 参数用于将参数传递给 register_taxonomy。使用 for_post_types 参数将分类法分配给某些文章类型。使用 name_singularname_plural 参数用于在后台生成标签。

更新现有分类

更改分类的设置

使用 update() 函数更改现有分类法的设置。以下是一个更改分类法设置以使其在前端不可直接访问的示例。

functions.php

Types\Taxonomy::update( [
    'category' => [
        'args' => [
            'public'            => false,
            'show_ui'           => true,
            'show_in_nav_menus' => true,
        ],
    ],
] );

update() 函数接受一个包含分类法及其参数的关联数组。请确保在 init 钩子之前使用此函数。

重命名分类

有时您可能想要将现有分类法重命名以更好地反映其用途。

functions.php

Types\Taxonomy::rename( 'category', 'Topic', 'Topics' );

rename() 函数接受分类法作为第一个参数,分类法的新单数名称作为第二个参数,分类法的新复数名称作为第三个参数。如果省略第三个参数,则第二个参数将用作复数形式。请确保在 init 钩子之前使用此函数。

这实际上是一个简写函数,用于

Types\Taxonomy::update( [
    'category' => [
        'name_singular' => 'Topic',
        'name_plural'   => 'Topics,
    ],
] );

如果您只想重命名一个标签,例如菜单标签,您可以使用 taxonomy_labels_{$post_type} 过滤器。以下是一个更改文章菜单名称的示例

add_filter( 'taxonomy_labels_category', function( $labels ) {
    $labels->menu_name = 'Topics';

    return $labels;
}, 11 );

注销分类

如果您想为某些文章类型注销分类法,最好通过 unregister_taxonomy_for_object_type() 函数来实现。

/**
 * Unregister post categories and post tags.
 */
add_action( 'init', function() {
    unregister_taxonomy_for_object_type( 'category', 'post' );
    unregister_taxonomy_for_object_type( 'post_tag', 'post' );
} );

自定义帖子短链接

有时您希望在保存文章时覆盖文章的别名。可能的用例

  • 常见的文章复制插件通常只在文章别名的末尾添加 -copy-2 作为后缀。您想使用自己的模式。
  • 多个帖子具有相同的名称,但它们显示的元数据不同。例如,活动帖子可能具有不同的日期。您希望自动将活动日期添加到帖子别名中。

为了初始化,您需要创建一个Post_Slug实例并调用init()函数

$post_slugs = new Types\Post_Slug();
$post_slugs->init();

以下是一个针对自定义帖子别名的示例,该别名用于帖子类型course,您希望从帖子标题构建永久链接。在这种情况下,帖子标题将是课程编号。

$post_slugs = new Types\Post_Slug();
$post_slugs->init();

$post_slugs->register( [
    'course' => function( $post_slug, $post_data, $post_id ) {
        return $post_data['post_title'];
    },
] );

在回调中不必使用sanitize_title,因为该类在内部使用该函数。

以下是前面提到的活动帖子的另一个示例

$post_slugs->register_suffix_date( [
    'event' => [
        'meta_key' => 'date_start',
    ],
] );

register_suffix_date函数是一个特殊函数,它使得从帖子的元数据中提取日期并将其附加到别名中变得更容易。该函数接受一个关联数组,其中包含帖子类型及其函数参数

  • meta_key - 用于定义使用的元数据键的名称。默认为date_start
  • input_format - 定义元数据的日期格式。默认为Ymd
  • output_format - 定义用于后缀的输出日期格式。默认为Y-m-d

支持

这是我们用于开发WordPress主题的库。您可以自由使用它,但目前我们不提供任何支持。