If you hook into the hooks provided in update_post_meta()
function and still use this function in your callback, that would result in a loop which would probably end with the timeout..
As the per the comments:
add_action("wp_insert_post", function( $post_ID ) {
if ( ! $post_data = get_post( $post_ID ) ) return;
// try to make this run only once needed ( from the question, the content is empty and cPT is dlm_download )
if ( "dlm_download" == $post_data->post_type && ! $post_data->post_content ) {
update_option( "dlm_download_members_only_yes", $post_data->ID );
}
return;
}, 10);
add_action("init", function() {
if ( $pid = (int) get_option( "dlm_download_members_only_yes" ) ) {
update_post_meta( $pid, "_members_only", "yes" );
delete_option( "dlm_download_members_only_yes" );
} return;
});
init
hook is always there (page load, AJAX, etc) so this should always work and would work on multiple entries as well..