Füge einen Filter zu get_posts hinzu

Also versuche ich bestimmte Posts im Aufruf get_posts herauszufiltern. Im Wesentlichen möchte ich in der Lage sein, einen bestimmten Block von Posts anzugeben und nur die Posts zu erhalten, die dem Block entsprechen. Im Moment habe ich eine Tabelle, die sowohl Block-IDs als auch Post-IDs enthält. Daher habe ich mich mit den Posts_join und den posts_where-Hooks beschäftigt. Allerdings muss ich in der Lage sein, den abgerufenen Block dynamisch zu modifizieren, abhängig davon, was der Client gerade ausgewählt hat. Zu diesem Zweck verfolge ich, was der Kunde mit einem Cookie ausgewählt hat. Ich denke, dass ich in der Lage sein sollte, die Block-ID als einen anderen Wert in dem Array an get_posts zu übergeben, aber ich habe keine Ahnung, wie ich diesen Wert abrufen kann. Meine Frage ist also: Wie soll ich das machen?

Es scheint, dass die einfachste und eleganteste Lösung wäre, etwas hinzuzufügen wie:

$postargs = array( 'blockID' => $id ); $posts = get_posts($postargs); 

Ich weiß nur nicht, wie in meiner süchtig function:

 function set_block_filter($id){ /* This should probably use the posts_join hook */ /* $join = 'LEFT JOIN wdpress.$table_name ON wdpress.$table_name.post_id = wdpress.wp_posts.ID'*/ /* something like that ^ http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join*/ /* $where = ' AND block_id=$id '*/ } 

kann die blockID aus dem Array $ postargs abrufen.

EDIT: Also die Lösung war eigentlich sehr einfach, und ich denke, dass die meisten meiner Verwirrung aus meinem Missverständnis darüber entstanden ist, wie Cookies funktionieren. Da sie scheinbar serverseitig erreichbar sind, war meine Antwort:

 function set_block_filter($query){ if($query->is_category){ $query->set('meta_key', 'block'); $query->set('meta_value', $_COOKIE['block']); return; } } add_action('pre_get_posts','set_issue_filter'); 

Solutions Collecting From Web of "Füge einen Filter zu get_posts hinzu"

Warum nicht das Argument include (oder umgekehrt, exclude ) für get_posts() ? Es benötigt ein Array von Post-IDs.

Abhängig von dem Fluss der Interaktion würde ich die Information in entweder user_meta oder post_meta speichern. Wenn der Benutzer einen Block auswählt und sich nicht viel ändert, würde ich ihn in der Tabelle user_meta speichern. Auf dieselbe Weise protokolliert WordPress Ihre aktuellen Dashboard-Einstellungen im Admin-Steuerfeld.

Oder du könntest beides benutzen. Speichern Sie die verschiedenen Blöcke in post_meta und die aktuelle Auswahl des Benutzers in user_meta.

Ich würde Ajax nur verwenden, weil es mit WordPress so einfach ist und Sie die Seite nicht neu laden müssen. Dies hängt natürlich von Ihrem UI-Fluss ab.

  jQuery(document).ready(function($){ var userID = $("select [name='post-block']").attr("id"); $("select [name="post-block"]").change(function() { var option =""; $("select option:selected").each(function () { option += $(this).val(); }); $.ajax({ type: "POST", url: ajaxurl, data: {"action": "select-block", user_id: userID, user_option: option }, success: function(response) { alert('The database said: ' + response); } }); 

PHP

  add_action( 'wp_ajax_nopriv_select-block', 'update_block_options' ); function update_block_options() { $user_id = intval( $_POST['user_id'] ); $block_option = $_POST['user_option']; $option_array = get_post_meta( $post->ID, $block_option, true); update_user_meta( $user_id, 'user_block_options', (array) $option_array ); if (get_user_meta( $user_id, 'user_block_options' ) $response = get_user_meta( $user_id, 'user_block_options'; else $response = "Ooops something went wrong...."; echo $response; die(1); } 

Um die Optionen vor dem Ausführen von get_posts zu erhalten:

  $exclude_array = get_user_meta( get_current_user_id(), 'user_block_options' ); $posts = get_posts( array('exclude' => (array)($exclude_array() );