Un utente ha chiesto informazioni su Developing with WordPress di Wordpress

aggiunta di un filtro a post_link per collegare i post “bozza”

Un utente ha chiesto 👇

So di andare un po ‘controcorrente qui, ma ho un blog in cui autorizzo alcuni post (5-15) per alcune settimane in campeggio, e spesso voglio collegare quei post prima di pubblicarli effettivamente.

Ovviamente, voglio che i link continuino a funzionare anche dopo la pubblicazione e non cambio mai i titoli quando li scrivo: rimangono solo in bozza fino alla pubblicazione.

Speravo di assumere il filtro post_link in modo da poter utilizzare la funzionalità “inserisci ricerca collegamento ipertestuale” in TinyMCE al momento dell’autore: l’interfaccia utente in cui fai clic sul pulsante del link in entrata e inizi a digitare i termini di ricerca per i post pertinenti rinuncia / pagine, e seleziona quello a cui desideri collegarti.

Ecco il codice che devo fare nel mio functions.php:


function draft_permalink( $post) {
    if (in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) {
        $my_post = clone $post;
        $my_post->post_status = 'published';
        $my_post->post_name = sanitize_title($my_post->post_name ? $my_post->post_name : $my_post->post_title, $my_post->ID);
        $permalink = get_permalink($my_post);
    } else {
        $permalink = get_permalink();
    }

    return $permalink;
}

function get_draft_permalink( $url, $post, $leavename=false ) {

	if ( $post->post_status == 'draft' )
		$url = draft_permalink($post);

	return $url;
}
add_filter( 'post_link', 'get_draft_permalink', 10, 3 );

Tuttavia, non vedo nessuna delle mie bozze di post apparire nell’elenco quando digito i termini nei loro nomi.

Mi manca qualcosa di semplice?

Grazie!

(@bcworkz)

1 anno, 9 mesi fa

Userei un approccio completamente diverso. Vorrei utilizzare il filtro “wp_link_query_args” per modificare gli argomenti della query di ricerca per includere tutti gli stati del lavoro che desideri scegliere come target.

Quindi, per modificare i collegamenti non pubblicati per indirizzare il post quando viene pubblicato, utilizza il filtro “wp_link_query”.

Lanciatore di thread

(@turbodb)

1 anno, 9 mesi fa

Interessante, non sapevo di quel truffatore – grazie!

Sembra che potrei non dover fare nulla con ‘wp_link_query_args’ a meno che non sto fraintendendo – potrei mettere il post_status extra in wp_link_query (che rende i filtri predefiniti con ‘publish’)

Ma ancora una volta, sono molto nuovo in questo, quindi apprezzerei qualsiasi input / feedback.

Lanciatore di thread

(@turbodb)

1 anno, 9 mesi fa

Non importa, ora vedo che devo modificare _args, altrimenti l’elenco filtrato è già pubblicato.

Dagli una possibilità e lui farà rapporto.

Lanciatore di thread

(@turbodb)

1 anno, 9 mesi fa

Ok, quindi penso di averlo. Probabilmente non è carino e sono totalmente aperto a suggerimenti per migliorarlo, ma sembra funzionare per me (anche se non sono sicuro che abbia effetti collaterali in altre parti del sito)


function adventuretaco_wp_link_query_args( $query ) {
  //Abort early if the user will never see TinyMCE
  if ( ! current_user_can('edit_posts') && ! current_user_can('edit_pages') && get_user_option('rich_editing') == 'true')
    return;
  
  // make sure we are in the admin
  $post_status_array = $query['post_status'];
  $query['post_status'] = array_push($post_status_array, 'draft', 'pending', 'auto-draft');

  return $query;
}
add_filter( 'wp_link_query_args', 'adventuretaco_wp_link_query_args' );

function draft_permalink( $post_id, $current_permalink) {
  $post = get_post( $post_id );
  if (in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) {
    $my_post = clone $post;
    $my_post->post_status = 'published';
    $my_post->post_name = sanitize_title($my_post->post_name ? $my_post->post_name : $my_post->post_title, $my_post->ID);
    $permalink = get_permalink($my_post);
  } else {
    $permalink = $current_permalink;
  }
  return $permalink;
}

function adventuretaco_wp_link_query( $results, $query ) {
  foreach ( $results as &$result ) {
    $result['permalink'] = draft_permalink( $result['ID'], $result['permalink'] );    	
  }
  return $results;
}

add_filter( 'wp_link_query', 'adventuretaco_wp_link_query' );

Questa risposta è stata modificata 1 anno, 9 mesi fa.

(@bcworkz)

1 anno, 9 mesi fa

Mi piace, bel lavoro! Dubito davvero che influenzerà il tuo sito altrove. Credo che la funzione utilizzata da questi filtri sia unica per i processi dell’editor di lavori.

Lanciatore di thread

(@turbodb)

1 anno, 9 mesi fa

Quanto costa get_post ()? Apprezzo che ricevo di nuovo * tutti * i post dopo che la query originale ha già ricevuto tutti i post (con i miei argomenti di query aggiornati), in modo da poter ispezionare il post_status non passato come parte di $ results.

(@bcworkz)

1 anno, 9 mesi fa

È piuttosto efficace tramite ID, ma tutte queste domande individuali sono insieme. Non ho capito l’impatto sulla mia prima lettura. Hai ragione, non è desiderabile. Il tuo richiamo esegue gli argomenti della query utilizzati per ottenere l’elenco. Perché non ricollegare la domanda e utilizzare i risultati per lo stato del lavoro? I risultati dovrebbero essere compatibili in modo che l’elemento n dell’elenco dei collegamenti corrisponda all’elemento n dei risultati della domanda. Abbastanza facile da verificare il codice per esserne sicuri.

Pertanto, in vista dell’elenco degli oggetti lavoro, è possibile ricostruire l’elenco da zero ed eliminare l’elenco passato. È un peccato buttare via l’elenco iniziale, ma è meglio che fare una manciata di get_posts ().

Was this helpful?

0 / 0

Lascia un commento 0

Your email address will not be published. Required fields are marked *