I have a server side rendered block that lists cards with page thumbnails and the title wrapped in a link.
I want that the link only gets a href when I’m in the frontend so I avoid clicking on the cards by mistake in the backend and getting redirected to the card page.
Here is my code:

$link = is_admin() ? ""
        : " href="https://wordpress.stackexchange.com/questions/343583/" . get_permalink($post->ID) . """;
              
echo <<<CPTItem
    <div class="cpt-list-item"><a class="cpt-list-item__link" $link>
CPTItem;

Unfortunately is_admin() is returning false in the backend in the block itself. I really don’t know why, the only thing I can think about is that it’s because the block is server side rendered.
Is there a way around?

1
1

If you have a server side rendered block in the backend, it is rendered via the REST API endpoint /wp/v2/block-renderer/xyz/blockname. This endpoint calls your render function. In the frontend the render function is called directly. The function is_admin() checks if a backend page was requested. In a REST API Request is no backend page, so the function returns false on REST API requests.

Instead you can check, if it is a REST API request via:

if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
    return 'Backend';
} else {
    return 'Frontend';
};

Leave a Reply

Your email address will not be published. Required fields are marked *