Erlaube nur einen Beitrag mit einem bestimmten Metawert

Ich verwende ein benutzerdefiniertes Meta-Feld, um anzugeben, welcher Beitrag auf der Startseite angezeigt wird.

Dieses Metafeld ist ein wahrer / falscher Wert, der durch ACF deklariert wird.

Ich möchte, dass diese Bedingung nur auf einen Beitrag angewendet wird, dh wenn der Benutzer einen Beitrag als “vorgestellten” deklariert und speichert, sollten alle anderen (theoretisch nur der letzte), bei denen dieser Meta-Wert aktiviert ist, gewendet werden. ” aus”.

Um dies zu erreichen, habe ich eine function an die Aktion “save_post” angehängt, die für den älteren Post-Meta-Wert zu “false” für die älteren vorgestellten Beiträge wird.

Das ist meine Annäherung, aber es gibt etwas, das ich vermisse, weil es überhaupt nicht funktioniert.

function only_one_agenda_featured( $post_id ) { // If this isn't a 'agenda' post, don't update it. if ( 'agenda' != $post->post_type ) { return; } // Stop when it is an autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // Prevent quick edit from clearing custom fields if (defined('DOING_AJAX') && DOING_AJAX) { return; } $post_meta_value = get_post_meta( $post_id, 'agenda_featured', TRUE ); if ( $post_meta_value == '1' ) { $args = array( 'meta_key' => 'agenda_featured', 'meta_value' => '1', 'post_type' => 'agenda', 'post__not_in' => array($post_id), ); $posts_to_update = get_posts( $args ); foreach ( $posts_to_update as $post_to_update ) { update_post_meta( $post_to_update->ID, 'agenda_featured', '0', '1' ); } } } add_action( 'save_post', 'only_one_agenda_featured' ); 

Jede Hilfe wird geschätzt.

Solutions Collecting From Web of "Erlaube nur einen Beitrag mit einem bestimmten Metawert"

Ich möchte, dass diese Bedingung nur auf einen Beitrag angewendet wird, dh wenn der Benutzer einen Beitrag als “vorgestellten” deklariert und speichert, sollten alle anderen (theoretisch nur der letzte), bei denen dieser Meta-Wert aktiviert ist, gewendet werden. ” aus”.

Sie können dann versuchen, stattdessen die einzige und am besten geeignete Post-ID als Option zu speichern.

Dann müssen Sie die Post-Meta-Tabelle nicht mit mehreren falschen Werten belasten.

Das erste Problem ist, dass $post nicht in Ihrem Callback enthalten ist. Sie müssen den Code ändern, um das zu ziehen:

 function only_one_agenda_featured( $post_id, $post ) { // ... } add_action( 'save_post', 'only_one_agenda_featured' ,10, 2); 

Angesichts dieser Änderung sollten die Dinge besser funktionieren, aber der Code ist übermäßig kompliziert. Sofern Sie keine Historie von alten agenda_featured Beiträgen benötigen, müssen Sie nur das alte Feld löschen und dann das neue Feld festlegen.

 function only_one_agenda_featured( $post_id, $post ) { // If this isn't a 'agenda' post, don't update it. if ( 'agenda' != $post->post_type ) { return; } // Stop when it is an autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // Prevent quick edit from clearing custom fields if (defined('DOING_AJAX') && DOING_AJAX) { return; } if (!empty($_POST['agenda_featured']) && true == $_POST['agenda_featured']) { // delete delete_metadata ( 'agenda', null, 'agenda_featured', null, true ); // and insert add_post_meta( $post_id, 'agenda_featured', true); } } add_action( 'save_post', 'only_one_agenda_featured' ,10, 2); 

Sie können dies weiter vereinfachen, indem Sie einen post-type-spezifischen Hook verwenden :

 3580 do_action( "save_post_{$post->post_type}", $post_ID, $post, $update ); 

Etwas wie:

 function only_one_agenda_featured( $post_id, $post ) { // Stop when it is an autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // Prevent quick edit from clearing custom fields if (defined('DOING_AJAX') && DOING_AJAX) { return; } if (!empty($_POST['agenda_featured']) && true == $_POST['agenda_featured']) { // delete delete_metadata ( 'agenda', null, 'agenda_featured', null, true ); // and insert add_post_meta( $post_id, 'agenda_featured', true); } } add_action( 'save_post_agenda', 'only_one_agenda_featured' ,10, 2); 

Du könntest das Löschen / Speichern etwas effizienter mit SQL machen, aber ich blieb bei Core-functionen wie ein guter Junge;)