web-dev-qa-db-fra.com

WP Cron et wp_insert_post

J'essaie d'insérer des publications à l'aide d'un travail cron, mais je continue à courir dans des erreurs où WP ne contient pas de fonctions (is_user_logged_in, wp_get_current_user).

Existe-t-il un moyen approprié d'exécuter wp_insert_post à l'aide d'un travail cron?

C'est le code que j'ai jusqu'à présent.

phrets_hourly est le hook WP_CRON

add_action('phrets_hourly', 'run_listings_update' );

function run_listings_update(){
  $fetch = new Fetcher();
  $fetch->fetch();
}

C'est le code à l'intérieur de l'objet $fetch (classe Fetcher) qui est exécuté.

public function fetch(){
  $options['class'] = 'RES';
  $options['limit'] = 10;
  $options['offset'] = 0;
  $options['silent'] = true;     
  $data = $this->query( $options );
  foreach ( $data as $datum ) {
    $this->place( $datum, true );
  }
}

public function place( $data, $silent ){
  $rets = $this->connect_to_rets();
  $listing = new Listing( $data );
  // check to see if listing already exists
  $post_id = $listing->check_listing_exists( $data['MST_MLS_NUMBER'] );
  if ( ! $post_id ) {
    $action = $listing->put();
  } else {
    $action = $listing->update($post_id);
  }
}

C'est la méthode appelée à partir de l'objet $listing (classe Listing) qui place les données dans la base de données.

public function put(){
  $title = $this->create_title( $this->data );
  // setup the 'post' data
  $post = array(
    'post_type' => 'listing',
    'post_title' => $title,
    'post_content' => $this->data['Remarks'],
    'post_status' => 'publish'
  );
  // add new meta data
  if ( ! is_wp_error( $post_id ) ) {
    $this->add_meta_data( $post_id );
    $this->assign_community( $post_id, $data );
  }
  // set the action
  $action = 'inserted';
  return $action;
}

Merci!

2
nathanaelphilip

Pour ceux qui tombent dessus plus tard, utilisez l’option 1 ou 2 trouvée ici: https://core.trac.wordpress.org/ticket/19373 .

"Pour les autres développeurs qui rencontrent ce problème et qui doivent y remédier, l'une ou l'autre de ces deux options fonctionne: appelez wp_set_post_terms () pour ajouter vos taxonomies après avoir appelé wp_insert_post (), configurez un" utilisateur actuel "dans votre script avant d'appeler wp_insert_post (). ”

2
nathanaelphilip

J'ai trouvé un moyen de contourner celui-ci.

Cela ne donne aucun sens au trac de base et il n’a toujours pas été corrigé, même s’il s’agit d’un ticket vieux de 4 ans. Voici le code que j'ai utilisé pour insérer un message personnalisé. La directiveinclude_onceest importante ici.

Je dois également noter que lewp_set_auth_cookie (1)définit les droits d'accès de ce script à l'administrateur. Si vous n'utilisez pas l'ID 1 pour votre administrateur, vous devrez le mettre à jour. La fonction est également obsolète, vous devez donc inclure le fichier pluggable.php.

//Add in the pluggable functions
include_once( ABSPATH . WPINC . '/pluggable.php' );
wp_set_auth_cookie( 1 );

$slug = strtolower("test-example");
$title = "Test Example";

//See if post exists or not then handle accordingly
$post_id = get_page_by_title( $title, OBJECT, 'cars' );

if( $post_id == NULL ) {
    $post_id = wp_insert_post(
        array(
            'comment_status'    =>  'closed',
            'ping_status'       =>  'closed',
            'post_author'       =>  1,
            'post_name'         =>  $slug,
            'post_title'        =>  $title,
            'post_status'       =>  'publish',
            'post_type'         =>  'cars'
        )
    );
} else {
    $post_id = $post_id->ID;
}

Changez simplementcarspour le type de message que vous voulez. Leslug/titledevra également être modifié en conséquence.

1
ryanka