innanzitutto non capisco perchè rendi globale $p se poi ti serve la variabile $email

comunque

function extract_email( $attr, $email = null ){
global $email;
//Estraggo gli attributi passati
extract( shortcode_atts( array( 'class' => 'extract_email' ), $attr));

//Controllo che esista del contenuto inserito
if( $email ){
//Creo la box
$p = "<p class=" . $class . ">" . $email . "</p>";
}
return
$p;
}


e quando ci sta l'altra funzione devi renderla globale anche li

function altra_funzione(){
global $email;
echo $email;
}


oppure


add_shortcode("email", "extract_email");
function
extract_email( $attr, $email = null ){
define("EMAIL", $email);
//Estraggo gli attributi passati
extract( shortcode_atts( array( 'class' => 'extract_email' ), $attr));

//Controllo che esista del contenuto inserito
if( $email ){
//Creo la box
$p = "<p class=" . $class . ">" . $email . "</p>";
}
return
$p;
}
echo
EMAIL;