There may be a better way around this but I would allow comments on the entire site and make sure that your custom post type supports comments:
<?php
register_post_type( 'custom', array(
// ..
supports => array(
'comments',
),
) );
?>
Then add the following function to your functions.php
file:
function hide_comment_form( $post_type="custom" )
{
// If user is logged in return false
if ( is_user_logged_in() ) {
return false;
} else {
// Else check for special post type
// If on custom post type single return false
if ( is_singular( $post_type ) ) {
return false;
}
// Else return true (hide the form)
return true;
}
}
You can then wrap your comment_form()
code within the template in the following:
if ( ! hide_comment_form() ) {
comment_form();
}
The function will always hide the comment form when a user isn’t logged in, except when the comment form appears on a custom post type page.
If you didn’t want to edit your template file you could also add the following to your functions.php
file:
function comment_form_before_function()
{
if ( hide_comment_form() ) {
echo '<div style="display: none;">';
}
}
add_action( 'comment_form_before', 'comment_form_before_function', 1 );
function comment_form_after_function()
{
if ( hide_comment_form() ) {
echo '</div>';
}
}
add_action( 'comment_form_after', 'comment_form_after_function', 99 );