it-swarm.com.de

Nach benutzerdefiniertem Feld filtern für benutzerdefinierten Beitragstyp Admin-Liste

Ich habe einen benutzerdefinierten Beitragstyp "Artikel" mit einem benutzerdefinierten Feld "Ausgabe", das die ID-Nummer eines Beitragstyps "Ausgabe" ist, den ich mithilfe eines einfachen Auswahlfelds auswähle.

Ich möchte eine Dropdown-Liste mit Problemen hinzufügen, um die hier gefundene Artikelliste zu filtern:

edit.php?post_type=article

Ist das möglich? Ist so etwas irgendwo dokumentiert? Ich konnte keine Dokumentation oder Beispiele finden.

welche Haken gibt es zum Filtern von Listen und Hinzufügen von Auswahlen zu den Filtersteuerelementen?

3
Will

Ich musste die maximale Antwort ändern, damit der Filter funktioniert. Durch das Umbenennen der Auswahl in "issue_restrict_articles" wurde die fehlerhafte Filterung gestoppt und die Filtersteuerelemente auf dem Bildschirm beibehalten. posts_where-Filter und eine SQL-Abfrage, die tatsächlich gefiltert werden soll.

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' );
8
Will

Fügen Sie folgenden Code in Ihr Design ein: 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');
}
3
Max Yudin