web-dev-qa-db-fra.com

Inclure les brouillons dans la boîte de dialogue du lien interne

Ok, alors je fais un nouveau projet et nous allons utiliser Wordpress comme un magazine CMS. Dans certains cas, nous aurons un groupe d'articles sur un sujet et il sera naturel de faire le lien entre les articles. Donc, nous sommes ici en édition finale dans WP.
Nous voulons ajouter un lien d'un projet d'article à un autre projet d'article du cluster, mais l'article cible n'a pas été publié. Par conséquent, WP ne l'affiche pas dans la zone Link to Existing Content. . Bien sûr, je peux obtenir le lien abrégé pour le brouillon de l'article vers lequel je veux créer un lien, mais je dois ensuite ouvrir cet onglet, obtenir le lien abrégé (ou le slug du projet), puis revenir au message à partir duquel je veux faire le lien, ajoutez le lien. Il est parfois utile de le faire, mais le flux de travail est une tâche constante.

Maintenant, nous pouvons simplement publier, puis parcourir à la hâte les articles et relier les éléments, mais cela n’est pas optimal. Je ne peux pas imaginer que tous les magazines et autres sites qui publient des périodiques avec WP le fassent cependant. Je vais jouer avec Editflow pour voir s’il existe un moyen de gérer cela, mais est-ce que quelqu'un connaît un moyen de créer un lien entre les brouillons et de faire en sorte que le lien soit correct quand ils sont tous deux publiés?

Et oui, je sais que je peux relier les choses après la publication. Voir 'workflow de merde'.

1
rick gregory

Ceci est très similaire à cette question .

Nous devons nous connecter à check_ajax_referer pour traiter uniquement la fonction de liaison interne. Ensuite, nous enregistrons une action pour pre_get_posts afin d'étendre la recherche aux brouillons et aux messages en attente.

Nous n'aurons toujours pas de jolis permaliens, car ils sont exclus dans get_permalink. Nous avons donc enregistré un filtre pour cela aussi et demandé à nouveau à WordPress de nous fournir un lien permanent, mais avec un statut de post factice.

Comme code:

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