• tommiec

    (@tommiec)


    Query Loop Block is extraordinarily powerful. I am using FSE. I want to filter data via any number of meta keys and values from the editor. I think it might be good if the editor could allow a method to include such variable data , which would support the desired behavior. Please let me know what I am missing if this is already possible.

    Use case: I want to combine that power to filter posts using a dynamic variable (populated from PHP) with a custom meta value. For example; Filter all custom post types if the meta value on the WP User object matches with a meta value one or more posts. I want to do this in a secure way so that folks cannot change the author-id in the browser editor to see other folks posts.

    It is not clear how one could use stored meta values in the FSE (code view) or in visual block mode. The idea is that sometimes one needs to access stored meta for a user and provide that as a filter on a query block. There seems no way to connect a variable found in dynamic data (PHP) in a specific block enabled page. However the query block appears to support various hardcoded attributes in the FSE.

    Since the page has blocks everywhere I don’t expect that I could drop into PHP to grab my user meta value?

    Alternatives might be if I could set the query in code and then it would filter as needed using some dynamic data (PHP?). Not sure of WPQuery behavior. Could I load a query before the page is presented and have the posts use the active query?

    • This topic was modified 1 month ago by tommiec. Reason: Clarify my use case scenario (I can probably limit in PHP)
    • This topic was modified 1 month ago by tommiec. Reason: Reordered paragraphs 1,2
    • This topic was modified 1 month ago by tommiec.
Viewing 2 replies - 1 through 2 (of 2 total)
  • Hello @tommiec

    You can use the pre_get_posts filter in WordPress to modify the query on the server side before it gets executed. This way, you can securely add dynamic filtering based on the current user meta without exposing any parameters in the front-end editor.

    function filter_posts_by_user_meta( $query ) {
    if ( ! is_admin() && $query->is_main_query() ) {

    if ( is_user_logged_in() ) {
    $current_user_id = get_current_user_id();


    $user_meta_value = get_user_meta( $current_user_id, 'your_user_meta_key', true );

    // Modify the query to filter posts by the custom post meta
    if ( ! empty( $user_meta_value ) ) {
    $query->set( 'meta_query', array(
    array(
    'key' => 'your_post_meta_key',
    'value' => $user_meta_value,
    'compare' => '='
    ),
    ));
    }
    }
    }
    }
    add_action( 'pre_get_posts', 'filter_posts_by_user_meta' );
    Moderator bcworkz

    (@bcworkz)

    I agree that pre_get_posts is a powerful way to modify a query, but do not use $query->is_main_query() as a conditional like Dhruvik suggested. A query loop is not the main query, the query for the current page is the main query. Because all post queries run through pre_get_posts, you’ll need to do additional checking to ensure you’re altering the right query. There is likely a unique set of query vars being used for a query loop. If they all exist, you can be reasonably sure you’re altering the right query.

    Things get more difficult if you need to pass additional data to your pre_get_posts callback. You’re limited in what kinds of data can be passed from a query loop block. In order to pass custom data you’d either need a custom block or custom shortcode. If you do that, there’s likely no need to use pre_get_posts since you can set up the query any way you like from the start.

Viewing 2 replies - 1 through 2 (of 2 total)
  • You must be logged in to reply to this topic.