[guided]The reason we begin with terms is that atomic formulas are built out of terms. Let $\mathrm{Var}$ be the set of variables of $L$, and let
\begin{align*}
s: \mathrm{Var} \to |M|
\end{align*}
be an assignment. Transporting $s$ through the isomorphism gives the assignment
\begin{align*}
h_*s: \mathrm{Var} &\to |N| \\
y &\mapsto h(s(y)).
\end{align*}
For each $L$-term $t$, we claim that interpreting $t$ first in $M$ and then applying $h$ gives the same element as transporting the assignment first and then interpreting $t$ in $N$:
\begin{align*}
h(t^M[s]) = t^N[h_*s].
\end{align*}
We prove this by structural induction on the term $t$. If $t$ is a variable $y$, then its interpretation in $M$ is $s(y)$, while its interpretation in $N$ under $h_*s$ is $(h_*s)(y)=h(s(y))$. Hence
\begin{align*}
h(t^M[s]) = h(s(y)) = t^N[h_*s].
\end{align*}
If $t$ is a constant symbol $c$, then $t^M[s]=c^M$ and $t^N[h_*s]=c^N$. Because $h$ is an isomorphism of $L$-structures, it preserves constant symbols, so
\begin{align*}
h(c^M)=c^N.
\end{align*}
For the inductive step, suppose
\begin{align*}
t = F(t_1,\dots,t_k),
\end{align*}
where $F$ is a $k$-ary function symbol of $L$. The induction hypothesis says that each argument term already commutes with $h$:
\begin{align*}
h(t_i^M[s]) = t_i^N[h_*s]
\end{align*}
for every $i \in \{1,\dots,k\}$. Since $h$ is an isomorphism, it preserves the function symbol $F$, meaning
\begin{align*}
h(F^M(b_1,\dots,b_k))
=
F^N(h(b_1),\dots,h(b_k))
\end{align*}
for all $b_1,\dots,b_k \in |M|$. Applying this with $b_i=t_i^M[s]$ gives
\begin{align*}
h(t^M[s])
&=
h(F^M(t_1^M[s],\dots,t_k^M[s])) \\
&=
F^N(h(t_1^M[s]),\dots,h(t_k^M[s])) \\
&=
F^N(t_1^N[h_*s],\dots,t_k^N[h_*s]) \\
&=
t^N[h_*s].
\end{align*}
This completes the term induction.[/guided]