В наши дни для многих проектов WordPress мы используем пользовательские типы записей. Команда разработчиков WordPress создала несколько удобных методов для их интеграции в ваши проекты. Но когда вы часто используете пользовательские типы записей, таксономии и мета-блоки, вполне вероятно, что вы будете повторяться. Вот почему мы собираемся использовать возможности этих функций WordPress для создания более мощного класса, который мы можем использовать для быстрой регистрации типов записей, таксономий и мета-блоков.
Позвоните в наш класс
Вот как мы называем наш класс, когда это будет сделано.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
include(‘custom-post-type.php’);
$book = new Custom_Post_Type( ‘Book’ );
$book->add_taxonomy( ‘category’ );
$book->add_taxonomy( ‘author’ );
$book->add_meta_box(
‘Book Info’,
array(
‘Year’ => ‘text’,
‘Genre’ => ‘text’
)
);
$book->add_meta_box(
‘Author Info’,
array(
‘Name’ => ‘text’,
‘Nationality’ => ‘text’,
‘Birthday’ => ‘text’
)
);
|
Шаг 1 Класс, свойства и методы
Мы начнем с создания класса, основных свойств, конструктора и методов. В этом уроке мы наполним их нашей логикой программирования.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
class Custom_Post_Type
{
public $post_type_name;
public $post_type_args;
public $post_type_labels;
/* Class constructor */
public function __construct()
{
}
/* Method which registers the post type */
public function register_post_type()
{
}
/* Method to attach the taxonomy to the post type */
public function add_taxonomy()
{
}
/* Attaches meta boxes to the post type */
public function add_meta_box()
{
}
/* Listens for when the post type being saved */
public function save()
{
}
}
|
Шаг 2 Конструктор
Внутри конструктора мы создаем несколько важных переменных, которые используются внутри всего класса. Мы также вызываем add_action чтобы зарегистрировать тип записи, и мы прослушиваем, когда тип записи сохраняется, чтобы мы могли сохранить метаданные нашего сообщения. Если тип записи существует, add_action не вызывается, но $post_type_name установлено, поэтому мы можем добавить в него таксономии и мета-блоки.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public function __construct( $name, $args = array(), $labels = array() )
{
// Set some important variables
$this->post_type_name = strtolower( str_replace( ‘ ‘, ‘_’, $name ) );
$this->post_type_args = $args;
$this->post_type_labels = $labels;
// Add action to register the post type, if the post type does not already exist
if( ! post_type_exists( $this->post_type_name ) )
{
add_action( ‘init’, array( &$this, ‘register_post_type’ ) );
}
// Listen for the save post hook
$this->save();
}
|
Шаг 3 Зарегистрируйте тип сообщения
В методе register_post_type , который add_action в конструкторе, мы сначала определяем имя (с большой буквы) и множественное число. С этим именем и множественным числом мы создаем наши метки для типа записи и перезаписываем (и объединяем) их с заданными метками из переменной $this->post_type_labels . Затем мы создаем наши аргументы по тому же принципу.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
public function register_post_type()
{
//Capitilize the words and make it plural
$name = ucwords( str_replace( ‘_’, ‘ ‘, $this->post_type_name ) );
$plural = $name .
// We set the default labels based on the post type name and plural.
$labels = array_merge(
// Default
array(
‘name’ => _x( $plural, ‘post type general name’ ),
‘singular_name’ => _x( $name, ‘post type singular name’ ),
‘add_new’ => _x( ‘Add New’, strtolower( $name ) ),
‘add_new_item’ => __( ‘Add New ‘ . $name ),
‘edit_item’ => __( ‘Edit ‘ . $name ),
‘new_item’ => __( ‘New ‘ . $name ),
‘all_items’ => __( ‘All ‘ . $plural ),
‘view_item’ => __( ‘View ‘ . $name ),
‘search_items’ => __( ‘Search ‘ . $plural ),
‘not_found’ => __( ‘No ‘ . strtolower( $plural ) . ‘ found’),
‘not_found_in_trash’ => __( ‘No ‘ . strtolower( $plural ) . ‘ found in Trash’),
‘parent_item_colon’ => »,
‘menu_name’ => $plural
),
// Given labels
$this->post_type_labels
);
// Same principle as the labels.
$args = array_merge(
// Default
array(
‘label’ => $plural,
‘labels’ => $labels,
‘public’ => true,
‘show_ui’ => true,
‘supports’ => array( ‘title’, ‘editor’ ),
‘show_in_nav_menus’ => true,
‘_builtin’ => false,
),
// Given args
$this->post_type_args
);
// Register the post type
register_post_type( $this->post_type_name, $args );
}
|
Шаг 3 Добавьте несколько таксономий
Сначала мы проверяем, является ли параметр $name пустым. Когда это так, мы ничего не делаем. Когда это не так, мы создаем три переменные, в которых мы храним информацию для таксономии: $taxonomy_name , $taxonomy_labels и $taxonomy_args .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public function add_taxonomy( $name, $args = array(), $labels = array() )
{
if( ! empty( $name ) )
{
// We need to know the post type name, so the new taxonomy can be attached to it.
$post_type_name = $this->post_type_name;
// Taxonomy properties
$taxonomy_name = strtolower( str_replace( ‘ ‘, ‘_’, $name ) );
$taxonomy_labels = $labels;
$taxonomy_args = $args;
/* More code coming */
}
}
|
После того, как мы выполнили первые проверки и затем установили некоторые переменные, мы собираемся зарегистрировать тип записи. Но сначала мы проверим, существует ли таксономия.
|
1
2
3
4
5
6
7
8
|
if( ! taxonomy_exists( $taxonomy_name ) )
{
/* Create taxonomy and attach it to the object type (post type) */
}
else
{
/* The taxonomy already exists.
}
|
Если таксономия не существует, мы регистрируем ее. Мы используем add_action , но не обычным способом. Обычно вторым параметром add_action является имя функции, но поскольку мы каждый раз используем разные параметры, мы собираемся передать безымянную функцию ( Примечание: для этой функции требуется PHP 5.3+) и использовать функцию use() . С use() функции use() мы можем передавать переменные в безымянную функцию. На этот раз нам нужно передать $taxonomy_name , $post_type_name и $taxonomy_args для регистрации таксономии.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
//Capitilize the words and make it plural
$name = ucwords( str_replace( ‘_’, ‘ ‘, $name ) );
$plural = $name .
// Default labels, overwrite them with the given labels.
$labels = array_merge(
// Default
array(
‘name’ => _x( $plural, ‘taxonomy general name’ ),
‘singular_name’ => _x( $name, ‘taxonomy singular name’ ),
‘search_items’ => __( ‘Search ‘ . $plural ),
‘all_items’ => __( ‘All ‘ . $plural ),
‘parent_item’ => __( ‘Parent ‘ . $name ),
‘parent_item_colon’ => __( ‘Parent ‘ . $name . ‘:’ ),
‘edit_item’ => __( ‘Edit ‘ . $name ),
‘update_item’ => __( ‘Update ‘ . $name ),
‘add_new_item’ => __( ‘Add New ‘ . $name ),
‘new_item_name’ => __( ‘New ‘ . $name . ‘ Name’ ),
‘menu_name’ => __( $name ),
),
// Given labels
$taxonomy_labels
);
// Default arguments, overwritten with the given arguments
$args = array_merge(
// Default
array(
‘label’ => $plural,
‘labels’ => $labels,
‘public’ => true,
‘show_ui’ => true,
‘show_in_nav_menus’ => true,
‘_builtin’ => false,
),
// Given
$taxonomy_args
);
// Add the taxonomy to the post type
add_action( ‘init’,
function() use( $taxonomy_name, $post_type_name, $args )
{
register_taxonomy( $taxonomy_name, $post_type_name, $args );
}
);
|
Когда таксономия не существует, мы прикрепляем ее только к нашему типу записи. Как и раньше, мы используем безымянную функцию и функцию use() . На этот раз нам нужно только передать $taxonomy_name и $post_type_name .
|
1
2
3
4
5
6
|
add_action( ‘init’,
function() use( $taxonomy_name, $post_type_name )
{
register_taxonomy_for_object_type( $taxonomy_name, $post_type_name );
}
);
|
Шаг 4, мета-боксы
Для регистрации мета-блоков нам нужно имя типа записи, поэтому сначала мы определим это. После этого нам понадобятся некоторые переменные для самого мета-блока, и мы сделаем пользовательские мета-поля глобальными, чтобы мы могли получить к ним доступ в хуке сохранения. Мы не будем здесь подробно рассказывать, потому что Тэмми Харт уже сделала очень полезное руководство по использованию мета-блоков многократного использования .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
public function add_meta_box( $title, $fields = array(), $context = ‘normal’, $priority = ‘default’ )
{
if( ! empty( $title ) )
{
// We need to know the Post Type name again
$post_type_name = $this->post_type_name;
// Meta variables
$box_id = strtolower( str_replace( ‘ ‘, ‘_’, $title ) );
$box_title = ucwords( str_replace( ‘_’, ‘ ‘, $title ) );
$box_context = $context;
$box_priority = $priority;
// Make the fields global
global $custom_fields;
$custom_fields[$title] = $fields;
/* More code coming */
}
}
|
Когда мы устанавливаем переменные и глобальные переменные, мы регистрируем мета-поле с помощью add_action . Как и раньше, мы используем безымянную функцию. На этот раз нам нужны $box_id , $box_title , $post_type_name , $box_context , $box_priority и $fields .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
add_action( ‘admin_init’,
function() use( $box_id, $box_title, $post_type_name, $box_context, $box_priority, $fields )
{
add_meta_box(
$box_id,
$box_title,
function( $post, $data )
{
global $post;
// Nonce field for some validation
wp_nonce_field( plugin_basename( __FILE__ ), ‘custom_post_type’ );
// Get all inputs from $data
$custom_fields = $data[‘args’][0];
// Get the saved values
$meta = get_post_custom( $post->ID );
// Check the array and loop through it
if( ! empty( $custom_fields ) )
{
/* Loop through $custom_fields */
foreach( $custom_fields as $label => $type )
{
$field_id_name = strtolower( str_replace( ‘ ‘, ‘_’, $data[‘id’] ) ) .
echo ‘<label for=»‘ . $field_id_name . ‘»>’ .
}
}
},
$post_type_name,
$box_context,
$box_priority,
array( $fields )
);
}
);
|
Шаг 5 Сохраните метаданные сообщения
Сохраните все метаданные поста. Мы перебираем их, используя глобальные $custom_fields . Это также быстрое освещение, см . Учебник Тэмми Харт о мета-блоках многократного использования .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public function save()
{
// Need the post type name again
$post_type_name = $this->post_type_name;
add_action( ‘save_post’,
function() use( $post_type_name )
{
// Deny the WordPress autosave function
if( defined(‘DOING_AUTOSAVE’) && DOING_AUTOSAVE ) return;
if ( ! wp_verify_nonce( $_POST[‘custom_post_type’], plugin_basename(__FILE__) ) ) return;
global $post;
if( isset( $_POST ) && isset( $post->ID ) && get_post_type( $post->ID ) == $post_type_name )
{
global $custom_fields;
// Loop through each meta box
foreach( $custom_fields as $title => $fields )
{
// Loop through all fields
foreach( $fields as $label => $type )
{
$field_id_name = strtolower( str_replace( ‘ ‘, ‘_’, $title ) ) .
update_post_meta( $post->ID, $field_id_name, $_POST[‘custom_meta’][$field_id_name] );
}
}
}
}
);
}
|
Шаг 6 Оптимизация
Как видите, мы используем strtolower( str_replace( ' ', '_', $string ) ) и ucwords( str_replace( '_', ' ', $string ) ) несколько раз. Причина создания этого класса в том, что мы не повторяем себя, поэтому мы не хотим делать это и в этой части. Вот почему мы создаем несколько вспомогательных методов. Таким образом, мы можем сделать это: $name = self::beautify( $string ); вместо $name = strtolower( str_replace( ' ', '_', $title ) );
|
1
2
3
4
5
6
7
8
9
|
public static function beautify( $string )
{
return ucwords( str_replace( ‘_’, ‘ ‘, $string ) );
}
public static function uglify( $string )
{
return strtolower( str_replace( ‘ ‘, ‘_’, $string ) );
}
|
Другой момент — формы множественного числа, которые мы создаем. Мы просто создаем их, добавляя к слову «s». Но что происходит, когда слово оканчивается на «у»? По этой причине мы создаем вспомогательный метод для определения формы слова во множественном числе. Теперь мы можем легко сделать это: $plural = self::pluralize( $string ) и форма нашего слова во множественном числе будет определена.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
public static function pluralize( $string )
{
$last = $string[strlen( $string ) — 1];
if( $last == ‘y’ )
{
$cut = substr( $string, 0, -1 );
//convert y to ies
$plural = $cut .
}
else
{
// just attach an s
$plural = $string .
}
return $plural;
}
|
Заворачивать
И теперь мы закончили. Теперь вы можете использовать этот класс для простой регистрации типов записей, таксономий и мета-блоков. Если у вас есть предложения или вопросы, просто оставьте комментарий, чтобы мы могли поговорить об этом. Надеюсь увидеть вас в следующий раз!
Кроме того, я хотел бы отдать должное Джеффри Вей. Я использовал его урок как вдохновение для своего урока и для этого урока. Кроме того, я хотел бы поблагодарить Тэмми Харт за создание учебного пособия по использованию мета-блоков . Посмотрите на их работу.