Mu-Plugin 1.5.0: Reihenfolge-Feld und Loop-Grid-Sortierung

This commit is contained in:
2026-09-22 13:54:28 +02:00
parent 39163f43bb
commit 257a414649
4 changed files with 154 additions and 84 deletions

View File

@@ -1,8 +1,8 @@
<?php
/**
* Plugin Name: Skrift Ratgeber Felder
* Description: Meta-Felder fuer Ratgeberartikel (kurzantwort, faq, faq_ueberschrift, cta_ziel, stand_datum) mit Eingabebox im Editor, Shortcodes, Elementor-Widgets fuer FAQ und Kurzantwort sowie Dynamic Tags fuer Lesezeit, FAQ-Ueberschrift und Stand.
* Version: 1.4.0
* Description: Meta-Felder fuer Ratgeberartikel (kurzantwort, faq, faq_ueberschrift, cta_ziel, stand_datum, ratgeber_reihenfolge) mit Eingabebox im Editor, Shortcodes, Elementor-Widgets fuer FAQ und Kurzantwort sowie Dynamic Tags fuer Lesezeit, FAQ-Ueberschrift und Stand.
* Version: 1.5.0
* Author: Lucas Orth
*
* Ablage: wp-content/mu-plugins/skrift-ratgeber-felder.php
@@ -54,6 +54,16 @@ add_action( 'init', function () {
'auth_callback' => 'skrift_ratgeber_meta_auth',
) );
// Feste Reihenfolge im Loop Grid, klein = weiter vorn. Schritte von 10 lassen Platz zum Einschieben.
register_post_meta( 'post', 'ratgeber_reihenfolge', array(
'type' => 'integer',
'single' => true,
'default' => 999,
'show_in_rest' => true,
'sanitize_callback' => 'absint',
'auth_callback' => 'skrift_ratgeber_meta_auth',
) );
register_post_meta( 'post', 'faq', array(
'type' => 'array',
'single' => true,
@@ -101,6 +111,8 @@ function skrift_ratgeber_metabox( $post ) {
$cta = (string) get_post_meta( $post->ID, 'cta_ziel', true );
$stand = (string) get_post_meta( $post->ID, 'stand_datum', true );
$faq_u = (string) get_post_meta( $post->ID, 'faq_ueberschrift', true );
$rf = get_post_meta( $post->ID, 'ratgeber_reihenfolge', true );
$rf = ( '' === $rf ) ? 999 : (int) $rf;
$faq = get_post_meta( $post->ID, 'faq', true );
if ( ! is_array( $faq ) ) {
$faq = array();
@@ -132,6 +144,11 @@ function skrift_ratgeber_metabox( $post ) {
<label for="skrift_stand_datum">Stand</label>
<input type="date" id="skrift_stand_datum" name="skrift_stand_datum" value="<?php echo esc_attr( $stand ); ?>">
</p>
<p>
<label for="skrift_reihenfolge">Reihenfolge</label>
<input type="number" min="0" step="1" id="skrift_reihenfolge" name="skrift_reihenfolge" value="<?php echo esc_attr( $rf ); ?>">
<span class="description">Klein = weiter vorn im Loop Grid.</span>
</p>
</div>
<p>
@@ -199,6 +216,7 @@ add_action( 'save_post_post', function ( $post_id ) {
update_post_meta( $post_id, 'kurzantwort', wp_kses_post( wp_unslash( $_POST['skrift_kurzantwort'] ?? '' ) ) );
update_post_meta( $post_id, 'faq_ueberschrift', sanitize_text_field( wp_unslash( $_POST['skrift_faq_ueberschrift'] ?? '' ) ) );
update_post_meta( $post_id, 'cta_ziel', esc_url_raw( wp_unslash( $_POST['skrift_cta_ziel'] ?? '' ) ) );
update_post_meta( $post_id, 'ratgeber_reihenfolge', isset( $_POST['skrift_reihenfolge'] ) && '' !== $_POST['skrift_reihenfolge'] ? absint( $_POST['skrift_reihenfolge'] ) : 999 );
update_post_meta( $post_id, 'stand_datum', skrift_ratgeber_datum( sanitize_text_field( wp_unslash( $_POST['skrift_stand_datum'] ?? '' ) ) ) );
$faq = array();
@@ -753,3 +771,32 @@ add_action( 'elementor/dynamic_tags/register', function ( $dynamic_tags ) {
$dynamic_tags->register( new Skrift_Tag_FAQ_Ueberschrift() );
$dynamic_tags->register( new Skrift_Tag_Stand() );
} );
/* ------------------------------------------------------------------------
* Loop Grid: Sortierung ueber ratgeber_reihenfolge
* In Elementor im Loop Grid unter Abfrage > Abfrage-ID "skrift_ratgeber" eintragen.
* Kategorie-Filter aus dem Widget (Einschliessen nach Begriff) bleibt erhalten.
* Beitraege ohne Wert landen hinten, bei gleichem Wert entscheidet das Datum.
* --------------------------------------------------------------------- */
add_action( 'elementor/query/skrift_ratgeber', function ( $query ) {
$meta_query = (array) $query->get( 'meta_query' );
$meta_query[] = array(
'relation' => 'OR',
'rf_vorhanden' => array( 'key' => 'ratgeber_reihenfolge', 'type' => 'NUMERIC', 'compare' => 'EXISTS' ),
'rf_fehlt' => array( 'key' => 'ratgeber_reihenfolge', 'compare' => 'NOT EXISTS' ),
);
$query->set( 'meta_query', $meta_query );
$query->set( 'orderby', array( 'rf_vorhanden' => 'ASC', 'date' => 'DESC' ) );
} );
// Beitraege ohne Wert bekommen beim Speichern 999, damit sie in der Sortierung hinten stehen.
add_action( 'save_post_post', function ( $post_id ) {
if ( wp_is_post_revision( $post_id ) ) {
return;
}
if ( ! metadata_exists( 'post', $post_id, 'ratgeber_reihenfolge' ) ) {
update_post_meta( $post_id, 'ratgeber_reihenfolge', 999 );
}
}, 20 );