it-swarm.com.de

Wie gruppiere ich Posts nach dem ersten Buchstaben oder der ersten Zahl?

 Can You plz guide me  Wie erstelle ich die Logik, mit der diese Beiträge entweder nach dem ersten Buchstaben des Titels oder nach den ersten Zahlen sortiert werden können?

Wenn ich auf einen "Brief" klicke, müssen die Beiträge mit dem angegebenen Anfangsbuchstaben aktualisiert werden. Wenn ich auf einen "Brief" klicke, müssen die Beiträge mit dem angegebenen Anfangsbuchstaben aktualisiert werden

Wenn Sie die Originalseite überprüfen möchten: https://neverquit.000webhostapp.com/library

3
Ashley

Ich denke, es gibt einen besseren Ansatz. Erstellen Sie einfach eine benutzerdefinierte Taxonomie, die die alphanumerischen Begriffe enthält, und weisen Sie dann jedem Beitrag den richtigen Begriff zu.

Sie können die Aktion "Beitrag speichern" verwenden, um Beiträge beim Speichern des Beitrags automatisch dem richtigen Begriff zuzuweisen:

function save_index( $post_id ) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    $slug   = 'post';
    $letter = '';

    // only run for posts
    if ( isset( $_POST['post_type'] ) && ( $slug != $_POST['post_type'] ) ) {
        return;
    }

    // Check user capabilities
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }

    $taxonomy = 'index'; // our custom taxonomy

    if ( isset( $_POST['post_type'] ) ) {

        // Get the title of the post
        $title = strtolower( $_POST['post_title'] );

        // The next few lines remove A, An, or The from the start of the title
        $splitTitle    = explode( ' ', $title );
        $blacklist     = [ 'an ', 'a ', 'the ' ];
        $splitTitle[0] = str_replace( $blacklist, '', strtolower( $splitTitle[0] ) );
        $title         = implode( ' ', $splitTitle );

        // Get the first letter of the title
        $letter = substr( $title, 0, 1 );

        // Set to 0-9 if it's a number
        if ( is_numeric( $letter ) ) {
            $letter = '0-9';
        }

    // set term as first letter of post title, lower case
    wp_set_post_terms( $post_id, $letter, $taxonomy );
    }
}

add_action( 'save_post', 'save_index' );
5
Alex Sancho

Dies ist ein wenig kurz und nicht sehr detailliert. Ich habe vor, darauf irgendwann noch einmal genauer einzugehen.

Kurzfristig sollte diese Lösung genau das tun, was Sie benötigen. Sie müssen es natürlich erweitern, aber es macht die Grundlagen.

In diesem Beispiel wird davon ausgegangen, dass der Post-Typ mbe-members und der Überschreibungs-Slug des Post-Typs /member/ lautet.

Schritt 1) ​​Fügen Sie die benutzerdefinierte Rewrite-Regel und die Abfragevariable hinzu

add_action( 'init', function () {

    add_rewrite_tag( '%member-filter%', 'members/filter/([a-zA-Z0-9-]{1,3})', 'post_type=mbe-members&filter=' );
    add_permastruct( 'member-filter', '%member-filter%', array( 'with_front' => false ) );

} );

Sie müssen sicherstellen, dass dies durchgeführt wird, bevor Ihr Beitragstyp registriert wurde.

Sie müssen auch sicherstellen, dass Sie Ihre Umschreiberegeln leeren.

Hinweis: Der Einfachheit halber werden die restlichen Aufgaben in der Vorlagendatei Ihres Post Type Archive-Themas ausgeführt. (Ich werde diesen Teil in Zukunft verbessern)

Schritt 2) Bestimmen Sie, was gefiltert werden muss

$filter       = get_query_var( 'filter' );
$filter_start = null;
$filter_end   = null;

if ( strpos( $filter, '-' ) !== false ) {

    if ( $pieces = explode( '-', $filter ) ) {

        if ( isset( $pieces[0] ) ) {
            $filter_start = $pieces[0];
        }

        if ( isset( $pieces[1] ) ) {
            $filter_end = $pieces[1];
        }

    }

} else {
    $filter_start = substr( $filter, 0, 1 );
}

Diese Filterung ermöglicht auch einen Bereich von Buchstaben oder Zahlen.

A/K/A - Sie können Folgendes angeben: /members/filter/a oder /members/filter/a-z/

Schritt 3) Fragen Sie Post-IDs nach gefilterten Übereinstimmungen ab

global $wpdb;

$post_ids = array();

if ( ! is_null( $filter_start ) && ! is_null( $filter_end ) ) {

    $range = range( $filter_start, $filter_end );

    foreach ( $range as $value ) {

        $query_args = array(
            'SELECT' => 'ID',
            'FROM'   => $wpdb->posts,
            'WHERE'  => 'post_title'
        );

        if ( $query = $wpdb->get_results( $wpdb->prepare( "
            SELECT {$query_args['SELECT']}
            FROM {$query_args['FROM']}
            WHERE {$query_args['WHERE']}
            LIKE %s
            AND post_type = %s
            ", "{$value}%", 'mbe-members' ) ) ) {

            foreach ( $query as $result ) {

                if ( ! in_array( $result->ID, $post_ids ) ) {
                    $post_ids[] = $result->ID;
                }

            }

        }

    }

} else {

    if ( ! is_null( $filter_start ) ) {

        $value = $filter_start;

        $query_args = array(
            'SELECT' => 'ID',
            'FROM'   => $wpdb->posts,
            'WHERE'  => 'post_title',
        );

        if ( is_numeric( $value ) ) {
            $query_args['LIKE'] = '%d';
        } else {
            $query_args['LIKE'] = '%s';
        }

        if ( $query = $wpdb->get_results( $wpdb->prepare( "
            SELECT {$query_args['SELECT']}
            FROM {$query_args['FROM']}
            WHERE {$query_args['WHERE']}
            LIKE {$query_args['LIKE']}
            AND post_type = %s
            ", "{$value}%", "mbe-members" ) ) ) {

            foreach ( $query as $result ) {

                if ( ! in_array( $result->ID, $post_ids ) ) {
                    $post_ids[] = $result->ID;
                }

            }

        }

    }

}

Schritt 4) Fragen Sie die Post-Objekte ab und geben Sie die Anzeige aus

$content = '';

if ( ! empty( $post_ids ) ) {

    $query = new \WP_Query( array(
        'post_type'              => 'mbe-members',
        'posts_per_page'         => absint( get_option( 'posts_per_page' ) ),
        'post_status'            => 'publish',
        'orderby'                => 'post_title',
        'order'                  => 'ASC',
        'update_post_meta_cache' => false,
        'update_post_term_cache' => false,
        'suppress_filters'       => true,
        'post__in'               => $post_ids
    ) );

    if ( $query->have_posts() ) {

        foreach ( $query->posts as $post ) {
            $content .= $post->post_title . '<br />';
        }

    }

}

echo '<div>' . PHP_EOL;

echo '<ul class="nav nav-tabs" role="tablist">' . PHP_EOL;

$class = '';

if ( $filter == '0-9' ) {
    $class = 'active';
}

echo '<li role="presentation" class="' . $class . '"><a href="' . site_url( '/member/filter/0-9/' ) . '" aria-controls="0-9" role="tab">0-9</a></li>' . PHP_EOL;

foreach ( range( 'a', 'z' ) as $letter ) {

    $class = '';

    if ( $letter == $filter_start ) {
        $class = 'active';
    }

    echo '<li role="presentation" class="' . $class . '"><a href="' . site_url( '/member/filter/' . $letter . '/' ) . '" aria-controls="' . $letter . '" role="tab">' . $letter . '</a></li>' . PHP_EOL;

}

echo '</ul>' . PHP_EOL;

echo '<div class="tab-content">' . PHP_EOL;

$class = '';

if ( $filter == '0-9' ) {
    $class = 'active';
}

echo '<div role="tabpanel" class="tab-pane ' . $class . '" id="0-9">' . PHP_EOL;

if ( $filter == '0-9' ) {
    echo $content;
}

echo '</div>' . PHP_EOL;

foreach ( range( 'a', 'z' ) as $letter ) {

    $class = '';

    if ( $letter == $filter_start ) {
        $class = 'active';
    }

    echo '<div role="tabpanel" class="tab-pane ' . $class . '" id="' . $letter . '">' . PHP_EOL;

    if ( $letter == $filter_start ) {
        echo $content;
    }

    echo '</div>' . PHP_EOL;

}

echo '</div>' . PHP_EOL;

echo '</div>' . PHP_EOL;

Fazit

Wie gesagt, das war eine sehr schnelle Antwort. Welches beantwortet in der Tat Ihre Frage. Es ist sehr rau und einfach, aber es macht das, was Sie brauchen. Ich werde versuchen, diese Antwort zu verbessern, um eine etwas elegantere Lösung zu finden.

1
Michael Ecklund