J'ai un type de message personnalisé "Article" qui a un champ personnalisé "problème" qui correspond au numéro d'identification d'un type de message "problème" que je sélectionne à l'aide d'une simple zone de sélection.
Je souhaite ajouter une liste déroulante de problèmes pour filtrer la liste d'articles trouvée ici:
edit.php?post_type=article
Est-ce possible? Ce genre de chose est-il documenté quelque part? Je n'ai pas pu trouver de documentation ni d'exemples.
quels crochets existe-t-il pour filtrer les listes et ajouter des sélections aux contrôles de filtrage?
J'ai dû modifier max answer pour que le filtre fonctionne. Renommer select en issue_restrict_articles a arrêté le filtrage et a gardé les contrôles de filtrage à l’écran. filtre posts_where et une requête SQL à filtrer réellement.
function restrict_articles_by_issue() {
global $wpdb;
$issues = $wpdb->get_col("
SELECT DISTINCT meta_value
FROM ". $wpdb->postmeta ."
WHERE meta_key = 'issue'
ORDER BY meta_value
");
?>
<label for="issue">Issues:</label>
<select name="issue_restrict_articles" id="issue">
<option value="">Show all</option>
<?php foreach ($issues as $issue) { ?>
<option value="<?php echo esc_attr( $issue ); ?>" <?php if(isset($_GET['issue_restrict_articles']) && !empty($_GET['issue_restrict_articles']) ) selected($_GET['issue_restrict_articles'], $issue); ?>>
<?php
$issue = get_post($issue);
echo $issue->post_title;
?>
</option>
<?php } ?>
</select>
<?php
}
add_action('restrict_manage_posts','restrict_articles_by_issue');
function posts_where( $where ) {
if( is_admin() ) {
global $wpdb;
if ( isset( $_GET['issue_restrict_articles'] ) && !empty( $_GET['issue_restrict_articles'] ) && intval( $_GET['issue_restrict_articles'] ) != 0 ) {
$issue_number = intval( $_GET['issue_restrict_articles'] );
$where .= " AND ID IN (SELECT post_id FROM " . $wpdb->postmeta ."
WHERE meta_key='issue' AND meta_value=$issue_number )";
}
}
return $where;
}
add_filter( 'posts_where' , 'posts_where' );
Placez le code suivant dans votre thème functions.php
.
function articlesIssuesRequestAdmin($request) {
if( isset($_GET['issue']) && !empty($_GET['issue']) ) {
$request['meta_key'] = 'issue';
$request['meta_value'] = $_GET['issue'];
}
return $request;
}
function articlesIssuesRestrictManagePosts() {
global $wpdb;
$issues = $wpdb->get_col("
SELECT DISTINCT meta_value
FROM ". $wpdb->postmeta ."
WHERE meta_key = 'issue'
ORDER BY meta_value
");
?>
<label for="issue">Issues:</label>
<select name="issue" id="issue">
<option value="">Show all</option>
<?php foreach ($issues as $issue) { ?>
<option value="<?php echo esc_attr( $issue ); ?>" <?php if(isset($_GET['issue']) && !empty($_GET['issue']) ) selected($_GET['issue'], $issue); ?>><?php echo esc_attr($issue); ?></option>
<?php } ?>
</select>
<?php
}
if( is_admin() && isset($_GET['post_type']) && $_GET['post_type'] == 'articles' ) {
add_filter('request', 'articlesIssuesRequestAdmin');
add_filter('restrict_manage_posts', 'articlesIssuesRestrictManagePosts');
}