Heim  >  Artikel  >  Backend-Entwicklung  >  Erweitert: Wiederverwendbare benutzerdefinierte Meta-Box: Erweiterte Felder

Erweitert: Wiederverwendbare benutzerdefinierte Meta-Box: Erweiterte Felder

WBOY
WBOYOriginal
2023-09-02 18:17:08824Durchsuche

In Teil 1 unserer Tutorialserie zu benutzerdefinierten Meta-Box-Vorlagen haben wir erläutert, wie Sie eine benutzerdefinierte Meta-Box einrichten, die eine Reihe von Feldern durchläuft und jedes Feld zusammen mit dem für verschiedene Arten von Formularfeldern erforderlichen HTML-Code ausgibt. Jetzt können wir mit dem Hinzufügen einiger erweiterter Elemente zum Array und zur Switch-Box beginnen.


Rundfunkgruppe

Optionsschaltflächen werden eigentlich nie allein verwendet, da sie dazu dienen, den Benutzer zu zwingen, mindestens eine von zwei Optionen auszuwählen, und nicht als Ein-/Ausschalter wie ein Kontrollkästchen. Als Erstes müssen wir die einzelne Option zu unserem $custom_meta_fields-Array hinzufügen.

array (
	'label' => 'Radio Group',
	'desc'	=> 'A description for the field.',
	'id'	=> $prefix.'radio',
	'type'	=> 'radio',
	'options' => array (
		'one' => array (
			'label' => 'Option One',
			'value'	=> 'one'
		),
		'two' => array (
			'label' => 'Option Two',
			'value'	=> 'two'
		),
		'three' => array (
			'label' => 'Option Three',
			'value'	=> 'three'
		)
	)
)

Fügen Sie dies unbedingt zu den anderen Array-Elementen im ursprünglichen $custom_meta_fields Array hinzu, mit dem wir in Teil 1 begonnen haben.

Dieses Array ist fast identisch mit unserem Auswahlbox-Element. Es verfügt über ein Haupt-Tag, eine Beschreibung und eine eindeutige ID. Definieren Sie den Typ und fügen Sie dann das Optionsarray hinzu. Es ist wichtig, dass der Optionsschlüssel mit dem Optionswert übereinstimmt, da wir später das gespeicherte Array überprüfen, um den gespeicherten Wert zu erhalten.

// radio
case 'radio':
	foreach ( $field['options'] as $option ) {
		echo '<input type="radio" name="'.$field['id'].'" id="'.$option['value'].'" value="'.$option['value'].'" ',$meta == $option['value'] ? ' checked="checked"' : '',' />
				<label for="'.$option['value'].'">'.$option['label'].'</label><br />';
	}
break;

Dieser Code wird nach der letzten „Pause“ in unserem Meta-Box-Schalter hinzugefügt.

  • Durchlaufen Sie jede Option im verschachtelten Felder-Array „Optionen“
  • Verwenden Sie Inline-Bedingungen, um zu bestimmen, ob der gespeicherte Wert mit dem aktuell geöffneten Wert übereinstimmt. Wenn dies zutrifft, geben Sie das Attribut „geprüft“ aus
  • Verwenden Sie den Wert der Option als eindeutige ID des Etiketts
  • Fügen Sie am Ende ein Zeilenumbruchzeichen hinzu, damit die nächste Option in einer neuen Zeile steht
  • Ende mit Beschreibungsfeld. Das vorangehende „
    “ ist nicht erforderlich, da wir beim Durchlaufen der Optionen eines
  • hinterlassen haben

Kontrollkästchengruppe

Wir haben behandelt, wie man Kontrollkästchen als Schalter verwendet und wie man eine Option aus mehreren Optionen auswählt, aber wir möchten in der Lage sein, mehrere Werte für dasselbe Feld zu speichern? Hier kommen Kontrollkästchengruppen zum Einsatz.

array (
	'label'	=> 'Checkbox Group',
	'desc'	=> 'A description for the field.',
	'id'	=> $prefix.'checkbox_group',
	'type'	=> 'checkbox_group',
	'options' => array (
		'one' => array (
			'label' => 'Option One',
			'value'	=> 'one'
		),
		'two' => array (
			'label' => 'Option Two',
			'value'	=> 'two'
		),
		'three' => array (
			'label' => 'Option Three',
			'value'	=> 'three'
		)
	)
)

Wir fügen es erneut zum $custom_meta_fields-Array hinzu und die Einrichtung ist fast die gleiche wie bei einem ähnlichen Feld mit einer eindeutigen ID und einem definierten Typ.

// checkbox_group
case 'checkbox_group':
	foreach ($field['options'] as $option) {
		echo '<input type="checkbox" value="'.$option['value'].'" name="'.$field['id'].'[]" id="'.$option['value'].'"',$meta && in_array($option['value'], $meta) ? ' checked="checked"' : '',' /> 
				<label for="'.$option['value'].'">'.$option['label'].'</label><br />';
	}
	echo '<span class="description">'.$field['desc'].'</span>';
break;

Der größte Unterschied besteht darin, dass wir diese Daten als Array speichern.

  • Durchlaufen Sie jede im Array definierte Option
  • Speichern Sie Daten in einem Array, indem Sie am Ende des Namens eckige Klammern hinzufügen: []
  • In der Inline-Bedingung, die das Attribut „checked“ ausgibt, verwenden Sie „in_array()“, um zu prüfen, ob sich der Wert innerhalb des Arrays befindet
  • Wie zuvor, fügen Sie zu jeder Eingabe einen Wert hinzu, schließen Sie die Schleife und geben Sie die Beschreibung aus

Kategorieauswahl

Es ist großartig, benutzerdefinierte Taxonomien für verschiedene Zwecke bereitstellen zu können, aber manchmal möchten Sie die Benutzer darauf beschränken, nur einen Begriff pro Beitrag auszuwählen. Eine einfache Lösung besteht darin, das Standardauswahlfeld, das WordPress zur Seite „Beitrag verfassen“ hinzufügt, zu entfernen und es als Auswahlfeld zu einem benutzerdefinierten Metafeld hinzuzufügen.

array(
	'label' => 'Category',
	'id'	=> 'category',
	'type'	=> 'tax_select'
)

Für dieses Beispiel verwende ich die integrierte Taxonomie „Kategorie“. Fügen Sie es Ihrem $custom_meta_fields-Array hinzu. Stellen Sie sicher, dass die „id“ mit dem Kategorienamen übereinstimmt.

// tax_select
case 'tax_select':
	echo '<select name="'.$field['id'].'" id="'.$field['id'].'">
			<option value="">Select One</option>'; // Select One
	$terms = get_terms($field['id'], 'get=all');
	$selected = wp_get_object_terms($post->ID, $field['id']);
	foreach ($terms as $term) {
		if (!empty($selected) && !strcmp($term->slug, $selected[0]->slug)) 
			echo '<option value="'.$term->slug.'" selected="selected">'.$term->name.'</option>'; 
		else
			echo '<option value="'.$term->slug.'">'.$term->name.'</option>'; 
	}
	$taxonomy = get_taxonomy($field['id']);
	echo '</select><br /><span class="description"><a href="'.get_bloginfo('home').'/wp-admin/edit-tags.php?taxonomy='.$field['id'].'">Manage '.$taxonomy->label.'</a></span>';
break;

Wir benötigen mehr Informationen, um dieses Feld voll funktionsfähig zu machen als die anderen Felder, die wir eingerichtet haben.

  • Öffnen Sie das Auswahlfeld und fügen Sie einen leeren Wert als „Eins auswählen“ hinzu
  • Holen Sie sich alle Begriffe für die Satzklassifizierung
  • Begriffe für die aktuelle Kategorie speichern lassen
  • Beginnen Sie damit, jeden Begriff in einer Schleife durchzugehen.
  • Um die Dinge einfach und lesbar zu halten, verwenden wir eine bedingte Anweisung in voller Größe, die eine Option ausgibt, wenn sie mit dem gespeicherten Begriff übereinstimmt, und andernfalls eine reguläre Option.
  • Wenn Sie die Schleife schließen und das Feld auswählen, möchten wir einige Informationen über die Klassifizierung erhalten und diese in einer Variablen speichern.
  • Verwenden Sie Beschreibungsbereiche als einfache Möglichkeit, Benutzer mit Bereichen zu verknüpfen, in denen Taxonomiebegriffe verwaltet werden können. Stellen Sie sicher, dass die Pluralformen korrekt sind (es gibt keine Kategorie), indem Sie die Tags aus den von uns gesammelten $taxonomy-Informationen verwenden.

Standardkategoriefeld löschen

Da wir das Standardfeld durch ein benutzerdefiniertes Auswahlfeld überschreiben möchten, ohne dass es zu Konflikten hinsichtlich der Benutzererfahrung oder der Datenspeicherung kommt, ist es notwendig, das Bearbeitungsfeld der Taxonomie vom Bildschirm zu entfernen.

function remove_taxonomy_boxes() {
	remove_meta_box('categorydiv', 'post', 'side');
}
add_action( 'admin_menu' , 'remove_taxonomy_boxes' );

Sie könnten hier ein $custom_meta_fields 数组来循环遍历每个“tax_select”字段并将其添加到此删除函数中,但单独命名它们可能要简单得多。您需要知道分类框的 div 的 ID,才能正确删除它。在 WordPress Codex 中了解有关 remove_meta_box()-Array verwenden, um jedes „tax_select“-Feld zu durchlaufen und es dieser Löschfunktion hinzuzufügen, aber es ist wahrscheinlich viel einfacher, sie einzeln zu benennen. Sie müssen die ID des Div des Kategoriefelds kennen, um es korrekt löschen zu können. Erfahren Sie mehr über remove_meta_box() im WordPress-Codex.

Bedingungen speichern

Der letzte Schritt für dieses Feld besteht darin, sicherzustellen, dass die Taxonomie unverändert und nicht als benutzerdefiniertes Feld gespeichert wird. Dazu gehen wir zurück und modifizieren die save_custom_meta()-Funktion, die wir in Teil 1 dieser Serie erstellt haben.

Überspringen Sie es zunächst in der Feldschleife. Finden Sie diese Zeile:

foreach ($custom_meta_fields as $field) {

Dann fügen Sie diese Zeile hinzu:

if($field['type'] == 'tax_select') continue;

Dann fügen Sie nach der foreach-Schleife Folgendes hinzu:

// save taxonomies
$post = get_post($post_id);
$category = $_POST['category'];
wp_set_object_terms( $post_id, $category, 'category' );

Dabei wird lediglich der Wert aus unserem Kategorieauswahlfeld übernommen und als Kategoriebegriff für den Beitrag festgelegt.


发布选择

另一个不太可能但有用的字段是通过将 ID 保存在自定义字段中来将另一个帖子与某个帖子关联起来。这非常类似于 CMS,我发现它对于诸如链接幻灯片帖子类型以转到网站上的另一个帖子或页面之类的事情非常有用,只需从下拉菜单中选择它即可。您可以稍后在另一个函数中使用该 ID 查询该帖子,以从该帖子中获取您需要的任何信息。

array(
	'label' => 'Post List',
	'desc' => 'A description for the field.',
	'id' 	=>  $prefix.'post_id',
	'type' => 'post_list',
	'post_type' => array('post','page')
)

我们这里有所有常见的嫌疑人,但最后我们添加了一个额外的变量来保存您想要在列表中的帖子类型。您可以在此数组中包含帖子、页面和任何其他自定义帖子类型。

// post_list
case 'post_list':
$items = get_posts( array (
	'post_type'	=> $field['post_type'],
	'posts_per_page' => -1
));
	echo '<select name="'.$field['id'].'" id="'.$field['id'].'">
			<option value="">Select One</option>'; // Select One
		foreach($items as $item) {
			echo '<option value="'.$item->ID.'"',$meta == $item->ID ? ' selected="selected"' : '','>'.$item->post_type.': '.$item->post_title.'</option>';
		} // end foreach
	echo '</select><br /><span class="description">'.$field['desc'].'</span>';
break;

您可以添加很多选项来过滤此查询,但我们使用的是对设置帖子类型的所有帖子的基本抓取。

  • 查询所有帖子
  • 打开选择字段并添加空白值
  • 循环遍历每个帖子,并将 ID 设置为选项的值,并将标有帖子类型的标题设置为可供选择的显示文本
  • 关闭循环和选择字段并添加说明

结论

如果到目前为止您一直在关注本系列的两个部分,那么您的最终盒子应该如下图所示:

Erweitert: Wiederverwendbare benutzerdefinierte Meta-Box: Erweiterte Felder

我们确实正在填写可重复使用的模板,用于创建可重复的自定义元框字段,并添加了这种高级甚至非正统的字段。我们将在下一篇文章中用一些更棘手但有用的字段(例如日期选择器和图像上传器)来结束该系列。

Das obige ist der detaillierte Inhalt vonErweitert: Wiederverwendbare benutzerdefinierte Meta-Box: Erweiterte Felder. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn