Post Types Personalizados

O Onyx provê a possibilidade de criação de Post Types personalizados que podem ser feitas de duas formas. A primeira por meio deste arquivo ./core/config/cpts.php e a outra é instanciando um objeto da classe \Onyx\Cpt().


Parâmetros#

O único parâmetro obrigatório é o name(s) do post type podendo ser uma string como podemos ver no Exemplo 1 ou um array como no Exemplo 2. O Onyx vai extrair automaticamente slug, labels, options caso não sejam fornecidos assim como tentará aplicar o plural nas labels necessárias.

caution

Caso não fornecido, o parâmetro slug será utilizado para criação do post type e é ele que deverá ser utilizado para queries e relacionamentos. Por padrão o slug é extraído do valor name transformado para o plural.

Ex: 'Gêneros de Filme' terá como plural 'Gêneros de Filmes' e slug 'generos-de-filmes'.

ParamTipoDescriçãoObrigatório
name(s)string/arrayNome do Post Type✔
iconstringÍcone do Post Type✘
labelsarrayLabels customizadas✘
optionsarrayArgumentos de funcionamento✘
filtersarrayFiltros de pesquisa (selects) no admin✘
columnsarrayRegistrar colunas personalizadas no admin✘
info

Para saber as opções das labels e options, visite a documentação do WordPress register_post_type() e get_post_type_labels()

info

Ao adicionar parâmetros como labels ou options, você não precisa incluir todas as opções. Somente os parâmetros que você determinar serão substituídos no modelo.


Criando Post Types#

Utilizando este método, você não precisa instanciar a classe \Onyx\Cpt().

/*
|--------------------------------------------------------------------------
| My First Post Type (example 1)
|--------------------------------------------------------------------------
*/
[ 'My First CPT' ],
/*
|--------------------------------------------------------------------------
| My Second Post Type (example 2)
|--------------------------------------------------------------------------
*/
[
'names' => [
'name' => 'Product', // required
'plural' => 'Products' , // optional
'slug' => 'products' , // optional
],
'icon' => 'dashicons-admin-post',
'labels' => [
// all labels options from
// https://developer.wordpress.org/reference/functions/get_post_type_labels/
],
'options' => [
// all available arguments from `register_post_type` except `labels`
// https://developer.wordpress.org/reference/functions/register_post_type/
],
],

Filtros de Pesquisa#

Ao registrar uma Taxonomia personalizada, você pode também adicionar filtros de pesquisa na tabela de listagem do admin do WordPress

/*
|--------------------------------------------------------------------------
| Post type with custom admin filters
|--------------------------------------------------------------------------
*/
[
'My First CPT',
'filters' => [ 'my-custom-tax', 'other-custom-tax' ],
],

Colunas Personalizadas#

Você pode incluir, remover ou reordenar colunas personalizadas na tabela de listagem do admin do WordPress ao registrar um Post Type. Isso é bem útil quando você tem custom fields ou taxonomias personalizadas

info

Para adicionar colunas de taxonomias, ver registro em Taxonomia.

ParamTipoDescriçãoObrigatório
addarrayColunas para adicionar✘
orderarrayOrdenação das colunas✘
hidearrayRemover colunas✘

add#

ParamTipoDescriçãoObrigatório
labelstringLabel da coluna✔
populatecallableFunção que recebe 2 valores fn($column, $post_id)✔
sortstringMeta Key para ordenação✘
numericboolOrdenar via numeral ou string✘

order#

Um array com a chave ou nome da coluna. As colunas na tabela irão aparecer na ordem de inclusão do array.

hide#

Um array contendo a chave ou nome da coluna. As colunas adicionadas aqui serão removidas da tabela de listagem do admin.

Exemplo de Uso#

/*
|--------------------------------------------------------------------------
| Products Post Type with Custom Columns
|--------------------------------------------------------------------------
*/
[
'names' => [
'name' => 'Product', // required
'slug' => 'produtct' , // optional
],
'columns' => [
'add' => [
'column-1' => [
'label' => 'Column 1', // column label
'sort' => 'meta_field_1', // sort by meta_field_1
'numeric' => false, // is alphabetically
'populate' => 'get_meta_field_1', // get content from get_meta_field_1() function
],
'column-2' => [
'label' => 'Column 2', // column label
'sort' => 'meta_field_2', // sort by meta_field_1
'numeric' => true, // is numeric
'populate' => 'get_meta_field_2', // get content from get_meta_field_2() function
],
],
'order' => [
'my-custom-tax', // first column
'column-1', // second column
'title', // third column
],
'hide' => [ 'author' ], // hide author column
],
],
// Populate Column 1 with ACF
function get_meta_field_1($column, $post_id) {
return get_field('meta_field_1', $post_id);
}
// Populate Column 2 with ACF
function get_meta_field_2($column, $post_id) {
return get_field('meta_field_2', $post_id);
}

Regras de Capacidades#

Ao criar um post type, você poderá definir capacidades personalizadas caso necessário.

capability_type#

O atributo capability_type cria automaticamente as capacidades primitivas do WordPress baseadas no valor passado (edit_MYCPT, edit_others_MYCPT, delete_MYCPT, publish_MYCPT, read_private_MYCPT)

/*
|--------------------------------------------------------------------------
| My Custom Cap CPT
|--------------------------------------------------------------------------
*/
[
'names' => [
'name' => 'Cap',
'plural' => 'Caps' ,
'slug' => 'caps' ,
],
'icon' => 'dashicons-admin-post',
'options' => [
'capability_type' => 'cap'
],
],

Este exemplo irá setar:

  • edit_post como edit_cap
  • read_post como read_cap
  • delete_post como delete_cap
  • edit_posts como edit_caps
  • edit_others_posts como edit_others_caps
  • delete_posts como delete_caps
  • publish_posts como publish_caps
  • read_private_posts como read_private_caps
  • create_posts como edit_caps

custom_caps#

O atributo custom_caps adiciona automaticamente todas as capacidades primitivas extras do WordPress baseadas no valor passado. Ao usar custom_caps, não é necessário passar o parâmetro capability_type. O Onyx theme usará o name do Post Type para gerar as capacidades.

/*
|--------------------------------------------------------------------------
| My Advanced Custom Cap CPT
|--------------------------------------------------------------------------
*/
[
'names' => [
'name' => 'Product',
'plural' => 'Products' ,
'slug' => 'products' ,
],
'icon' => 'dashicons-admin-post',
'options' => [
'custom_caps' => true
],
],

Este exemplo irá setar regras mais completas:

  • edit_product
  • read_product
  • delete_product
  • edit_products
  • edit_others_products
  • publish_products
  • read_private_products
  • create_products
  • read_products
  • delete_products
  • delete_private_products
  • delete_published_products
  • delete_others_products
  • edit_private_products
  • edit_published_products
info

Se você precisar de regras mais personalizadas, utilize o atributo capabilities padrão do WordPress e determine manualmente todas as capacidades necessárias.


Instanciando um Post Type#

Além de poder criar um Post Type utilizando o registro no arquivo ./core/config/cpts.php, você pode instanciar um objeto e criar manualmente seu CPT usando a classe \Onyx\Cpt

Caso esteja extendendo a classe \Onyx\Cpt você ainda pode utilizar os métodos add_action e add_filter personalizados para criar hooks do wordpress dentro de seu objeto mais facilmente.

info

somente o parâmetro name(s) é obrigatório, podentro ser uma string ou um array.

Criando o Objeto#

$cpt = new \Onyx\Cpt();
// assign post type names
$cpt->names([
'name' => 'Product',
'plural' => 'Products',
'slug' => 'product',
]);
// assign post type arguments
$cpt->options([
'show_in_rest' => true,
'menu_position' => 10,
'supports' => ['title', 'editor', 'thumbnail'],
]);
// set post type icon
$cpt->icon('dashicons-admin-page');
// add search taxonomy filters
$cpt->filters( ['my-custom-taxonomy', 'my-other-taxonomy'] );
// METHOD 1: Add Columns
$cpt->columns()->register_columns([
'column-1' => [
'label' => 'Column 1', // column label
'sort' => 'meta_field_1', // sort by meta_field_1
'numeric' => false, // is alphabetically
'populate' => 'get_meta_field_1', // get content from get_meta_field_1() function
],
]);
// METHOD 2: Add Columns
$cpt->columns()->add('Column 2');
$cpt->columns()->populate('Column 2', 'get_meta_field_2');
$cpt->columns()->set_sortable( [
'Column 2' => [ 'meta_field_2', true ],
]);
// hide columns
$cpt->columns()->hide( [ 'author' ] );
// change columns order
$cpt->columns()->order([
'Date',
'Column 1',
'Column 2',
'Title',
]);
// register post type
$cpt->register();

Extendendo a classe#

namespace Paper\Types;
use Onyx\Cpt;
class CptCapas extends Cpt {
/**
* Constructor
*
* @return void
*/
public function __construct() {
$this->names( 'Capa' );
$this->options([
'rewrite' => [
'with_front' => false,
'feeds' => false,
],
'custom_caps' => true,
'capability_type' => 'capa',
'menu_position' => 5,
'supports' => [ 'title' ],
'exclude_from_search' => true,
'query_var' => true,
'can_export' => true,
]);
$this->labels([
'add_new' => 'Adicionar nova',
'add_new_item' => 'Adicionar nova capa',
'not_found' => 'Nenhuma capa encontrada',
'not_found_in_trash' => 'Nenhuma capa encontrada na lixeira',
]);
$this->icon( 'dashicons-admin-page' );
$this->add_action( 'post_type_link', 'custom_permalink', 1, 3 );
$this->add_action( 'init', 'custom_rewrite_rules' );
$this->register();
}
/**
* Custom permalink structure for CPT
* Replace default /capas/title-slug/ for /capas/$post-ID/
*
* @param string $url The original URL of the post type Capas
* @param object $post Post Object from Type Capas
*
* @return string|null
*/
public function custom_permalink( $url, $post = 0 ) {
if ( $post->post_type === $this->slug ) {
return home_url( $this->slug . '/' . $post->ID . '/' );
} else {
return $url;
}
}
/**
* Custom Rewrite for 'custom_permalink' to work
*
* @return void
*/
public function custom_rewrite_rules() {
add_rewrite_rule( $this->slug . '/([0-9]+)?$', 'index.php?post_type=' . $this->key . '&p=$matches[1]', 'top' );
}
}

Após a criação do post type, não esqueça de necessário registrá-lo em ./core/config/app.php como no exemplo abaixo.

return [
\Paper\Types\CptCapas::class,
];