Pre_Get_Posts隐藏“存档”类别中的Everywhere帖子

时间:2015-05-15 作者:niziou

我想隐藏一些帖子,从饲料,搜索和几乎一切,除了URL到这篇文章。有所谓的档案。私人帖子也不是一个选项,因为带有URL的未登录用户也应该看到它。

我使用了WP hide posts插件,但它给我的站点带来了非常大的负载(我每分钟大约有60-70个负载),我想创建自定义函数,但我对WordPress API和函数不太熟悉。但就我所读的codex而言,pre\\u get\\u post会在形成查询之前完成,所以据我所知,它不应该产生这么大的负载。

这是我需要你帮助的部分,以确保我朝着正确的方向前进。

因此,第一部分从类别向帖子添加元数据应该可以,对吗?但我不知道如何将其与pre\\u get\\u posts函数连接起来,我已经从codex中粘贴了一些函数,以从搜索结果和主页中排除帖子。

//adding value hidden to category \'archive\'
<?php
add_action(\'wp_insert_post\', \'my_add_custom_fields\');
function my_add_custom_fields($post_id)
{
    if(in_category( $archive)){
        if ( $_POST[\'post_type\'] == \'your_post_type\' ) {
            add_post_meta($post_id, \'hidden\', \'1\', true);
        }
}
    return true;
}
?>

//filtering out posts with meta key \'hidden\' and value \'1\'


<?php add_action( \'pre_get_posts\', \'your_function_name\' ); ?>

function search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set(\'post_type\', \'post\');
    }
  }
}

add_action(\'pre_get_posts\',\'search_filter\');function exclude_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( \'cat\', \'-1,-1347\' );
    }
}
add_action( \'pre_get_posts\', \'exclude_category\' );

function exclude_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( \'cat\', \'-1,-1347\' );
    }
}
add_action( \'pre_get_posts\', \'exclude_category\' );

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

我不确定您当前的“隐藏”复选框代码是如何工作的(有一个未定义的$archive 变量in_category 在上下文中可能不正确,我怀疑你的帖子类型实际上是your_post_type).

为了确保一切正常,这里提供了一个完整的解决方案,用于在编辑帖子屏幕中添加复选框,您可以在其中正确切换其“隐藏”状态:

/**
 * Register our meta box that will show the "hide this post" checkbox.
 */
function wpse_188443_add_hidden_meta_box( $post_type ) {
    $hidden_types = array(
        \'post\',
        // Add any other post types you need to hide
    );

    if ( in_array( $post_type, $hidden_types ) ) {
        add_meta_box(
            \'wpse_188443_hidden\',
            \'Hide Post From Archives\',
            \'wpse_188443_hidden_meta_box\',
            $post_type,
            \'side\' /* Either "advanced", "normal" or "side" */
        );
    }
}

add_action( \'add_meta_boxes\', \'wpse_188443_add_hidden_meta_box\' );

/**
 * Display our meta box.
 */
function wpse_188443_hidden_meta_box( $post ) {
    $is_hidden = !! get_post_meta( $post->ID, \'_hidden\', true );
    ?>

<label>
    <input type="checkbox" name="wpse_188443_hidden" <?php checked( $is_hidden ) ?> />
    Hide this post from archives
</label>

<!-- A hidden input so that we only update our checkbox state when this field exists in $_POST -->
<input type="hidden" name="wpse_188443_hidden_save" value="1" />

<?php
}

/**
 * Save our checkbox state.
 */
function wpse_188443_hidden_save( $post_id ) {
    if ( isset( $_POST[\'wpse_188443_hidden_save\'] ) ) {
        if ( isset( $_POST[\'wpse_188443_hidden\'] ) )
            update_post_meta( $post_id, \'_hidden\', \'1\' );
        else
            delete_post_meta( $post_id, \'_hidden\' );
    }
}

add_action( \'wp_insert_post\', \'wpse_188443_hidden_save\' );
阅读更多信息this answer 有关上述技术的说明。

现在要真正隐藏“隐藏”帖子,应该简单到:

function wpse_188443_hidden_posts( $wp_query ) {
    if ( ! is_admin() && $wp_query->is_main_query() && ! $wp_query->is_singular() ) {
        if ( ! $meta_query = $wp_query->get( \'meta_query\' ) )
            $meta_query = array();

        $meta_query[] = array(
            \'key\'     => \'_hidden\',
            \'value\'   => \'\',
            \'compare\' => \'NOT EXISTS\',
        );

        $wp_query->set( \'meta_query\', $meta_query );
    }
}

add_action( \'pre_get_posts\', \'wpse_188443_hidden_posts\' );

结束

相关推荐

Search with filters and title

我想搜索custom_post 按标题和ACF字段。所以,我用了WP_Query WordPress函数,但我不能按标题过滤,只能按过滤器过滤。当我提交表单时,我有这样的URL:http://example.com/?s=titre&filter1=condition1&filter2=condition2&filter3=condition3 我的代码:$title = $_GET[\'s\']; $args = array( \'pagenam