J'ai créé un type de publication personnalisé et je veux laisser l'utilisateur choisir la page statique de la page d'archive. Par exemple, sous la page Publier. J'aimerais ajouter une page de projets: [Dropdown]
Est-il possible d'ajouter une autre option de page statique à la page des paramètres de lecture? Existe-t-il un crochet pour le modifier?
De même, existe-t-il un moyen de marquer la page sélectionnée de cette manière dans Pages?
Mise à jour:
En regardant /wp/wp-admin/includes/template.php:1768
/**
* Filters the default post display states used in the posts list table.
*
* @since 2.8.0
* @since 3.6.0 Added the `$post` parameter.
*
* @param array $post_states An array of post display states.
* @param WP_Post $post The current post object.
*/
$post_states = apply_filters( 'display_post_states', $post_states, $post );
if ( ! empty($post_states) ) {
$state_count = count($post_states);
$i = 0;
echo ' — ';
foreach ( $post_states as $state ) {
++$i;
( $i == $state_count ) ? $sep = '' : $sep = ', ';
echo "<span class='post-state'>$state$sep</span>";
}
}
Il semble qu'il y ait des points d'ancrage pour le post_state, mais comment le configurez-vous?
Aussi, en regardant /wp-admin/options-reading.php:83
Est-il possible de modifier le paramètre Lecture sans modifier réellement le fichier?
Je ne sais pas s'il est possible d'ajouter un nouveau champ directement sous le champ déroulant "Page des messages". Au moins, je n'ai trouvé aucun moyen de le faire.
Mais vous pouvez simplement ajouter un autre menu déroulant à la page des paramètres de lecture. Ce sera sur le bas tu.
Pour ce faire, nous devons d’abord register
notre nouveau paramètre et add a new settings field
à la page WordPress reading
par défaut:
/**
* Register and define the settings
*/
add_action('admin_init', 'prfx_admin_init');
function prfx_admin_init(){
// register our setting
$args = array(
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
'default' => NULL,
);
register_setting(
'reading', // option group "reading", default WP group
'my_project_archive_page', // option name
$args
);
// add our new setting
add_settings_field(
'my_project_archive_page', // ID
__('Project Archive Page', 'textdomain'), // Title
'prfx_setting_callback_function', // Callback
'reading', // page
'default', // section
array( 'label_for' => 'my_project_archive_page' )
);
}
Nous pouvons maintenant créer la fonction de rappel pour notre champ personnalisé, qui contiendra notre balise HTML:
/**
* Custom field callback
*/
function prfx_setting_callback_function($args){
// get saved project page ID
$project_page_id = get_option('my_project_archive_page');
// get all pages
$args = array(
'posts_per_page' => -1,
'orderby' => 'name',
'order' => 'ASC',
'post_type' => 'page',
);
$items = get_posts( $args );
echo '<select id="my_project_archive_page" name="my_project_archive_page">';
// empty option as default
echo '<option value="0">'.__('— Select —', 'wordpress').'</option>';
// foreach page we create an option element, with the post-ID as value
foreach($items as $item) {
// add selected to the option if value is the same as $project_page_id
$selected = ($project_page_id == $item->ID) ? 'selected="selected"' : '';
echo '<option value="'.$item->ID.'" '.$selected.'>'.$item->post_title.'</option>';
}
echo '</select>';
}
Après cela, vous avez maintenant un nouveau champ déroulant sous Settings
> Reading
.
Le champ est rempli avec toutes les pages, vous pouvez en sélectionner une et enregistrer le réglage.
Alors maintenant, vous voulez mark
cette page sélectionnée dans la liste des pages dans admin. Ces marquages s'appellent state/s
. WordPress utilise un filtre pour ajouter ces textes au titre appelé display_post_states
.
/**
* Add custom state to post/page list
*/
add_filter('display_post_states', 'prfx_add_custom_post_states');
function prfx_add_custom_post_states($states) {
global $post;
// get saved project page ID
$project_page_id = get_option('my_project_archive_page');
// add our custom state after the post title only,
// if post-type is "page",
// "$post->ID" matches the "$project_page_id",
// and "$project_page_id" is not "0"
if( 'page' == get_post_type($post->ID) && $post->ID == $project_page_id && $project_page_id != '0') {
$states[] = __('My state', 'textdomain');
}
return $states;
}