Debes crear sentencias SQL de forma dinámica para cubrir los casos de esas dos variables PHP que puedan no tener valor . En esos casos tu sentencia SQL debe quedar sin el bloque SQL: idisla='$_POST[isla]' AND ó (idcat='$_POST[categoria]')
Es decir ..
Código PHP:
// Pre-definir variables vacias...
$categoria_sql='';
$isla_sql='';
$operador_sql='';
// Si tiene valor "categoria" .. añado el SQL correspondiente.
if (!empty($_POST['categoria'])){
$categoria_sql="idcat='".$_POST['categoria']."'";
}
// Si tiene valor "isla" .. añado el SQL correspondiente.
if((!empty($_POST['isla'])){
$isla_sql="idisla='".$_POST['isla']."'";
}
// Si "isla" y "categoria" tienen valor .. coloco el operador "AND" ...
if (!empty($_POST['isla']) && !empty($_POST['categoria'])){
$operador_sql="AND";
}
$cons_sql = "SELECT * FROM temas WHERE $isla_sql $operador_sql $categoria_sql AND (titulo LIKE '%$_POST[criterio]%') OR (texto LIKE '%$_POST[criterio]%') AND (validado=1)) ORDER BY fechainsercion DESC";
Revisa haciendo echo $cons_sql en todas las combinaciones posibles si la sentencia SQL que se compone es la que esperas.
Un saludo,