web-dev-qa-db-ja.com

下書きを内部リンクダイアログに含める

それで、私は新しいプロジェクトをやっています、そして私たちは雑誌のCMSとしてWordpressを使うつもりです。場合によっては、トピックに関する一連の記事があり、ある記事から別の記事にリンクするのは自然なことです。だから、ここで私たちはWPで最終編集中です。
クラスタ内のあるドラフト記事から別のドラフト記事へのリンクを追加したいのですが、ターゲット記事は公開されていないため、WPはそれをLink to Existing Contentボックスに表示しません。確かに、私はリンクしたい記事のドラフトのためのショートリンクを手に入れることができます、それから私はそのタブを開いて、ショートリンク(またはドラフトのスラッグ)を手に入れ、リンクしたい投稿に戻る必要があります、リンクを追加してください。たまにこれを実行することは問題ありませんが、一定のタスクとしては厄介なワークフローです。

今、私たちは単に公開してから急いで記事を調べて物事をリンクすることができますが、それは次善策です。 WPを使って定期的に発行している雑誌や他のサイトのすべてを想像することはできませんが。私はEditflowを使ってこれに対処する方法があるかどうか確かめますが、誰かがあるドラフトから別のドラフトにリンクする方法を知っていて、両方が公開されているときにリンクを正しくすることができますか。

そして、そうです、私は出版後に物事を結びつけることができることを知っています。 「安っぽいワークフロー」を参照してください。

1
rick gregory

これは この質問 とよく似ています。

内部リンク機能のみを扱うためにcheck_ajax_refererにフックする必要があります。それからpre_get_postsに対するアクションを登録して、検索を下書きと保留中の投稿に拡張します。

それらはget_permalinkで除外されているので、まだかなりのパーマリンクを得ることはありません。それで私たちはそのためのフィルタも登録して、再度パーマリンクを求めてWordPressに依頼しますが、偽の投稿ステータスを持っています。

コードとして:

add_action( 'check_ajax_referer', 'internal_links_for_drafts' );

/**
 * Extend search for internal links to 'draft' and 'pending' statuses.
 *
 * @wp-hook check_ajax_referer
 * @wp-hook pre_get_posts
 * @param string|WP_Query $var
 * @return boolean|void
 */
function internal_links_for_drafts( $var )
{
    if ( 'check_ajax_referer' === current_filter() && 'internal-linking' === $var )
        return add_action( 'pre_get_posts', __FUNCTION__ );

    // now we are in the 'pre_get_posts' action.
    $var->set( 'post_status', array( 'publish', 'pending', 'draft' ) );
    remove_action( 'pre_get_posts', __FUNCTION__ );
    add_filter( 'post_link', 'draft_permalink', 10, 2 );
}
/**
 * Get permalink for drafts and pending posts.
 *
 * Dangerous, because their title can still change.
 *
 * @param  string $permalink
 * @param  object $post
 * @return string
 */
function draft_permalink( $permalink, $post )
{
    remove_filter( current_filter(), __FUNCTION__ );

    // swap status temporary
    $original_status   = $post->post_status;
    $post->post_status = 'publish';
    $url               = get_permalink( $post );
    $post->post_status = $original_status;

    return $url;
}
1
fuxia