Add filter to get_posts

时间:2012-06-01 作者:MirroredFate

因此,我试图在get\\u posts调用中过滤掉某些帖子。本质上,我希望能够指定一个特定的帖子块,并且只获取与该块对应的帖子。现在我有一个包含块ID和post ID的表,所以我一直在研究如何使用posts\\u连接和posts\\u where挂钩。但是,我需要能够根据客户端当前选择的内容动态修改检索到的块。为此,我正在使用cookie跟踪客户端选择的内容。我觉得应该能够将块ID作为给定数组中的另一个值传递给get\\u posts,但我不知道如何检索该值。所以我的问题是:我应该怎么做?

似乎最简单、最优雅的解决方案就是添加以下内容:

$postargs = array(
    \'blockID\' => $id
);
$posts = get_posts($postargs);
我只是不知道如何在我的钩子函数中:

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 \'*/
}
可以从$postargs数组中检索blockID。

编辑:所以解决方法其实很简单,我想我的大部分困惑都是因为我对cookie的工作原理产生了误解。由于它们显然可以在服务器端访问,我的回答是:

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\');

2 个回复
SO网友:helenhousandi

为什么不使用include (或相反,exclude) 的参数get_posts()? 它需要一个post ID数组。

SO网友:Chris_O

根据交互的流程,我会将信息存储在user\\u meta或post\\u meta中。如果用户选择一个块,并且它不会经常更改,我会将其保存在user\\u meta表中。这与WordPress在管理面板中跟踪当前仪表板首选项的方式相同。

或者你可以两者兼用。将不同的块保存在post\\u meta中,并将用户当前选择保存在user\\u meta中。

我会使用Ajax,因为使用WordPress非常简单,而且不需要重新加载页面。这当然取决于您的UI流。

<select name="post-block" id="<?php echo get_current_user_id(); ?>">
<option value="_block-value1">Block Value 1</option>
<option value="_block-value2">Block Value 2</option>
</select>

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);
      }
要在运行get\\u帖子之前获取选项,请执行以下操作:
 $exclude_array = get_user_meta( get_current_user_id(), \'user_block_options\' );
 $posts = get_posts( array(\'exclude\' => (array)($exclude_array() );

结束

相关推荐

Search options/filters

我正在尝试向侧栏搜索框添加一些复选框选项,similar to this, 用户可以选择是否搜索All Words, Some Word, 或者Entire phrase.我确实在搜索后找到了这个-Wordpress Search Phrases. “句子”选项似乎很有效,但其他选项则不太好。下面的代码是我目前正在处理的,但如果能得到一些帮助使其正常工作,我将不胜感激。非常感谢S(我不想为此使用插件)。<form action=\"<?php bloginfo(\'home\'); ?>