0
votes

Obtenez l'ID de l'article que vous éditez actuellement dans WordPress

J'essaie d'obtenir l'ID du message que je suis en train de modifier dans functions.php dans le but de réécrire dynamiquement un slug de type d'article personnalisé.

C'est ce avec quoi je travaille jusqu'à présent. p >

function change_post_type_slug( $args, $post_type ) {

  if ( 'lead_page' == $post_type ) {

    $post_id = $_GET['post'];
    $location = get_field('leadpage_location', $post_id);
    $args['rewrite']['slug'] = $location->post_name;

  }

  return $args;

}
add_filter( 'register_post_type_args', 'change_post_type_slug', 10, 2 );

Je ne suis pas sûr si le hook register_post_type_args se déclenche avant que je puisse obtenir l'ID, ou si c'est même la meilleure façon de procéder J'essaye d'accomplir. Je ne trouve pas grand-chose sur le sujet.

J'ai pu le faire fonctionner avec les éléments suivants:

function change_post_type_slug( $args, $post_type ) {

  if ( 'custom_post' == $post_type ) {

    global $post;
    $location = get_field('custom_field', $post->ID);
    $args['rewrite']['slug'] = $location;

  }

  return $args;

}
add_filter( 'register_post_type_args', 'change_post_type_slug', 10, 2 );

Cependant, cela a abouti à un remarque sur le front-end: Remarque: index non défini: post dans /chemin/to/wordpress/functions.php à la ligne 623

La ligne 623 est $ post_id = $ _GET ['post'] ;


5 commentaires

Essayez ceci pour votre instruction if : if ('lead_page' === $ post_type && is_admin ()) Cela garantira qu'il ne se déclenche que du côté de l'administrateur et non du l'extrémité avant. Vous pouvez également l'associer pour savoir si vous êtes sur l'écran d'édition actuel: wordpress.stackexchange.com/questions/125692/...


C'est un excellent ajout.


Si cela fonctionne, faites-le moi savoir et je le mettrai comme réponse


Malheureusement, il affiche toujours l'avis dans l'administrateur lorsqu'il ne modifie pas ce type de publication particulier.


oui, vous devrez le combiner avec le lien que j'ai ajouté.


3 Réponses :


0
votes

mise à jour: strong>

Essayez ceci: p>

function change_post_types_slug( $args, $post_type ) {

   if ( 'your-custom_post' === $post_type ) {
        // Check and get the custom post ID 
        $id = isset($_GET[ 'post' ]) ? $_GET[ 'post' ] : '' ;
        // $location = get_field('leadpage_location', $id);
        $args['rewrite']['slug'] = 'new-slug-here';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );


15 commentaires

admin_head est une action et non un filtre à utiliser: add_action ('admin_head', 'change_post_type_slug') ;. Cependant, ce n'est pas la bonne façon de procéder, vous devez utiliser le hook updated_postmeta.


désolé mon mauvais register_post_type_args est le bon crochet pour cela. J'ai mis à jour la réponse et l'ai testée et cela semble fonctionner mais je n'ai pas pu tester get_field car je n'ai pas ACF.


Cela fonctionne (en quelque sorte) et c'est exactement ce que j'ai dans la deuxième boîte, et je reçois cet avis que j'ai mentionné ci-dessus sur chaque page qui n'est pas le type de poste (lors de la modification).


Je n'ai pas cet avis? Je suis en mode débogage btw. quelle version wp utilisez-vous? J'utilise la v5.1.


Aussi 5.1 - Je reçois l'avis avec le débogage activé et en affichant n'importe quelle page sur le frontend.


Remarque: Index non défini: post dans /var/www/html/path/to/wordpress/functions.php sur la ligne 612 La ligne 612 étant $ id = $ _GET ['post'];


Hmm, essayez de vérifier s'il existe un identifiant de publication. $ id = isset ($ _ GET ['post'])? $ _GET ['post']: '';


Cela prend en charge cet avis :) Cependant, lorsque je passe d'un slug statique à un slug dynamique avec ACF, cela donne maintenant une nouvelle erreur.


Plus facile à utiliser pastebin à ce stade: pastebin.com/ivWi1d1g En dehors de cet avis, cela fonctionne très bien.


Attendre. get_field renvoie true ou false Je suppose que the_field est ce dont vous avez besoin.


get_field () renvoie une valeur. Le champ "leadpage_location" est défini sur un objet de publication. advancedcustomfields.com/resources/get_field


Je vois .. vérifiez Utiliser des instructions conditionnelles ici : get_field renvoie faux si (valeur == “” || valeur == null || valeur == faux). voir également ici


Donc, la raison pour laquelle il donne le nouvel avis est que si vous n'éditez pas ce type de publication, alors $ id ne devient rien, et j'utilise $ id pour appeler le champ.


Oui, je suppose que le paramètre $ post_id est (facultatif) et s'il n'est pas présent, la valeur par défaut renverra le message actuel que vous éditez.


C'est vrai - mais comme tout cela est déclaré dans le fichier functions.php - il ne saurait à quel article référencer. Je repense honnêtement si cela va être possible. Je pourrais essayer de trouver un autre moyen. J'apprécie ton aide.



0
votes

Vous devez utiliser le hook updated_postmeta pour ceci, car il est exécuté chaque fois que vous mettez à jour vos champs personnalisés.

Ensuite, vous pouvez mettre à jour vos données de publication avec Fonction wp_update_post () .

add_action( 'updated_postmeta', function( $meta_id, $object_id, $meta_key, $meta_value ) {

    if ( 'location' === $meta_key ) {
        wp_update_post([
            'ID' => $object_id,
            'post_name' => $meta_value,
        ]);
    }

}, 10, 4 );


2 commentaires

Je ne pense pas que vous puissiez réécrire un slug de type de publication personnalisé avec wp_update_post ()


Oui, je ne parviens pas à le faire fonctionner. Par slug, je fais référence à domain.com/SLUG/pagetitle. Les types de publication personnalisés de Wordpress utilisent le type de publication comme slug par défaut, sauf indication contraire lors de l'enregistrement du type de publication.



0
votes

Essayez ceci:

function change_post_type_slug( $args, $post_type ) {

  if ( 'lead_page' === $post_type && is_admin() && $_GET['action'] === 'edit' ) {

    $post_id = $_GET['post'];
    $location = get_field('leadpage_location', $post_id);
    $args['rewrite']['slug'] = $location->post_name;

  }

  return $args;

}
add_filter( 'register_post_type_args', 'change_post_type_slug', 10, 2 );

Il ajoute deux conditions supplémentaires, pour vérifier si vous êtes sur l'écran d'administration et pour vérifier qu'il existe un paramètre GET sur edit . Il est probablement exagéré de faire aussi is_admin () , mais maintenant vous êtes super sûr.


0 commentaires