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
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' );
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.
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)
$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/
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;
}
}
}
}
}
$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;
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.