問題が発生している理由は、the_permalink()とthe_title()が返されず、エコーするためです。代わりにget_permalink()と$post->post_titleを使用してください。get_permalink ()にはパラメータとして投稿 ID ($post->ID) が必要です。これがいらいらし、直感に反することはわかっていますが、それがWordpressの仕組みです(この回答へのコメントの主観性を参照してください.)
これは、最初の質問で 2 番目の例が機能する理由を説明しています。文字列内から出力する関数を呼び出すと、エコーは文字列の末尾の前に出力されます。
したがって、この:
echo ' this should be before the link: '.the_permalink().' But it is not.';
期待どおりに動作しません。代わりに、次のように出力されます。
http://example.com this should be before the link: But it is not.
PHP では、一重引用符と二重引用符の両方を使用できます。HTML で文字列を作成するときは、通常、文字列を一重引用符で始めます。これにより、文字列内でエスケープせずに HTML 互換の二重引用符を使用できます。
切り上げると、次のようになります。
echo '<li><a href="'.get_permalink($post->ID).'">'.$post->post_title.'</a></li>';
または、最初に要求したように、単純にエスケープするには、引用符の前にバックスラッシュを付けます。そのように(一重引用符は削除されています)
echo "<li><a href=\"".get_permalink($post->ID)."\">".$post->post_title."</a></li>";
もちろん、これはloop 内からこれを呼び出していることを前提としています。それ以外の場合は、目的の出力を得るためにこれよりも少し多くのことが必要になります。