编写了一个WP Cron插件,它在激活时会触发致命错误

时间:2015-09-10 作者:christiancbergstrom

我正在为我的一个网站编写一个WP插件,该插件与公共API挂钩,以获取应用程序数据,并将其保存在Wordpress中,以便WP能够搜索;根据Wordpress中创建的新参数以及API中的参数过滤数据。

当我尝试激活插件时,我会通过/wp-admin/plugins.php 这表明

插件无法激活,因为它触发了fatal error.

    // Register cb Cron Jobs Activation & Add to Cron Queue
    register_activation_hook(__FILE__, \'cb_cron_jobs_activation\');
    add_action(\'my_hourly_event\', \'cb_app_post_type_sync\');

    function cb_cron_jobs_activation() {
      wp_schedule_event(time(), \'hourly\', \'my_hourly_event\' );  
    }

    // Update "app" Custom Post Type with cb App Market API Sync
    function cb_app_post_type_sync() {

      if ( post_type_exists(\'app\') ){



        /* ================================================================
        ** GET & USE MERCHANT PLANS API
        *  ================================================================ */

        // GET API info from MerchantPlans for bundle details for above apps
        $merchantplans_get_response = wp_remote_get( \'https://www.cb.com/v3/merchant_plans?expand=modules\' );

        $merchantplans_api_body_response = json_decode( wp_remote_retrieve_body( $merchantplans_get_response ), true );


        // Disect merchant_plans objects
        $merchantplans_elements = $merchantplans_api_body_response[\'elements\'];

        // Generate 3 arrays with module key=>value pairs: classic_bundle, terminal_bundle, register_bundle
        foreach ( $merchantplans_elements as $merchantplans_element ) {

          // Convert merchant bundle name into lowercase joined by underscores for better calling into taxonomies later
          $merchantplan_lowercase = strtolower($merchantplans_element[\'name\']);
          $merchantplan_underscores = str_replace(\' \', \'_\', $merchantplan_lowercase);
          ${$merchantplan_underscores} = array();

          // set variable for each merchant bundle module
          $merchantplans_modules_elements = $merchantplans_element[\'modules\'][\'elements\'];

          // add each marchant bundle module into the array of the associated merchant bundle with the id as the key in the key => value pair
          foreach( $merchantplans_modules_elements as $merchantplans_modules_element ) {
            ${$merchantplan_underscores}[$merchantplans_modules_element[\'id\']] = $merchantplans_modules_element[\'name\'];
          }

        }

        // find the difference between the register_bundle\'s modules & the terminal_bundle\'s modules
        $register_unique_modules = array_diff( $register_bundle, $terminal_bundle );
        // This is useful later when we are checking to see which apps belong in which bundles


        /* ================================================================
        ** GET & USE APPMARKET API TO SYNC APP INFO
        *  ================================================================ */

        // GET API info from apps for App Market details
        $appmarket_get_response = wp_remote_get( \'https://www.cb.com/v3/apps?expand=modules%2CavailableMetereds%2CavailableSubscriptions%2CdeviceTypes&filter=approvalStatus%3DPUBLISHED&filter=hidden%3Dfalse\' );

        $appmarket_api_body_response = json_decode( wp_remote_retrieve_body( $appmarket_get_response ), true );

        // Unpack the $appmarket_api_body_response array & Build a table to show the data
        $apps_elements = $appmarket_api_body_response[\'elements\'];

        // Run through every app returned in the appmarket API Get request and either update the "app" post type or create a new "app" in WP
        foreach ($apps_elements as $apps_element) {

          // Define the Available Subscription Arrays and Available Metered Arrays
          $available_subscription_elements = $apps_element[\'availableSubscriptions\'][\'elements\'];
          $available_metered_elements = $apps_element[\'availableMetereds\'][\'elements\'];

          // sort Availabe Subscription Arrays & return in lowest to highest amount order
          $subscription_amount_tmp = array();
          foreach( $available_subscription_elements as $key => &$element_row) {
              $subscription_amount_tmp[$key] = &$element_row[\'subscriptionCountries\'][\'elements\'][0][\'amount\'];
          }
          array_multisort($subscription_amount_tmp, $available_subscription_elements);

          // sort Available Metered Arrays & return in lowest to highest amount order
          $metered_amount_tmp = array();
          foreach( $available_subscription_elements as $key => &$element_row) {
              $metered_amount_tmp[$key] = &$element_row[\'meteredCountries\'][\'elements\'][0][\'amount\'];
          }
          array_multisort($metered_amount_tmp, $available_subscription_elements);

          // define the apps modules for comparing with the modules in register & terminal bundles to determine which bundle it belongs in
          $third_party_module_elements = $apps_element[\'modules\'][\'elements\'];

          // Count the modules per app and compare with modules in $register_unique_modules array
          // this allows us to determine if the app uses the register plan or the terminal plan
          $module_count = 0;
          foreach ( $third_party_module_elements as $third_party_module_element ) {
            if ( in_array( $third_party_module_element[\'name\'], $register_unique_modules )) {
                $module_count++;
            }
          }
          if ($module_count > 0) {
              $associated_app_plan = \'register-bundle\';
          } else {
              $associated_app_plan = \'terminal-bundle\';
          }
          /*
          $app_delete_query = array(
            \'post_type\' => \'app\',
            );
          */

          // Query the existing \'app\' post type to see if apps exist with the proper app_id.
          $app_update_args = array(
            \'post_type\' => \'app\',
            \'name\' => \'us-\' . $apps_element[\'id\'],
          );
          $app_update_query = new WP_Query( $app_update_args );

          // if the app exists check to see if the following values are the same and if not update them
          if ( $app_update_query->have_posts() ) : 
            while ( $app_update_query->have_posts() ) : $app_update_query->the_post();

              $app_in_wpdb = array(
                \'ID\'             => get_the_ID();
                \'post_title\'     => $apps_element[\'name\'],
                \'post_content\'   => $apps_element[\'description\'],
                \'post_name\'      => \'us-\' . $apps_element[\'id\'],    // The name (slug) for your post
                \'post_status\'    => \'publish\',
                \'post_type\'      => \'app\',
                \'post_author\'    => 1,
                \'menu_order\'     => $apps_element[\'sortOrder\'],
                \'tax_input\'      => array( \'cb_plan\' => $associated_app_plan ) // GET API info from apps for App Market details
              );

              wp_insert_post( $app_in_wpdb );

              if (is_wp_error($post_id)) {
                $errors = $post_id->get_error_messages();
                foreach ($errors as $error) {
                  echo $error;
                }
              }

            endwhile;

          // if the app doesn\'t exist, create the \'app\' post, and fill with the following values
          else:

            $new_app_in_wpdb = array(
                \'post_title\'     => $apps_element[\'name\'],          // The title of your post.
                \'post_content\'   => $apps_element[\'description\'],   // The full text of the post.
                \'post_name\'      => \'us-\' . $apps_element[\'id\'],    // The name (slug) for your post
                \'post_status\'    => \'publish\',
                \'post_type\'      => \'app\',
                \'post_author\'    => 1,
                \'menu_order\'     => $apps_element[\'sortOrder\'],
                \'tax_input\'      => array( \'cb_plan\' => $associated_app_plan ) // GET API info from apps for App Market details
              );
            $post_id = wp_insert_post( $new_app_in_wpdb );

            if (is_wp_error($post_id)) {
                $errors = $post_id->get_error_messages();
                foreach ($errors as $error) {
                  echo $error;
                }
              }
              // add app icon to WP Uploads Directory & then attach as featured image to post
              $image_url  = $apps_element[\'filenameIconLarge\']; // Define the image URL here
              $upload_dir = wp_upload_dir(); // Set upload folder
              $image_data = file_get_contents($image_url); // Get image data
              $filename   = basename($image_url); // Create image file name

              // Check folder permission and define file location
              if( wp_mkdir_p( $upload_dir[\'path\'] ) ) {
                  $file = $upload_dir[\'path\'] . \'/\' . $filename;
              } else {
                  $file = $upload_dir[\'basedir\'] . \'/\' . $filename;
              }

              // Create the image  file on the server
              file_put_contents( $file, $image_data );

              // Check image file type
              $wp_filetype = wp_check_filetype( $filename, null );

              // Set attachment data
              $attachment = array(
                  \'post_mime_type\' => $wp_filetype[\'type\'],
                  \'post_title\'     => sanitize_file_name( $filename ),
                  \'post_content\'   => \'\',
                  \'post_status\'    => \'inherit\'
              );

              // Create the attachment
              $attach_id = wp_insert_attachment( $attachment, $file, $post_id );

              // Include image.php
              require_once(ABSPATH . \'wp-admin/includes/image.php\');

              // Define attachment metadata
              $attach_data = wp_generate_attachment_metadata( $attach_id, $file );

              // Assign metadata to attachment
              wp_update_attachment_metadata( $attach_id, $attach_data );

              // And finally assign featured image to post
              set_post_thumbnail( $post_id, $attach_id );

              // update public_app_url
              $public_app_url = \'https://www.cb.com/appmarket/apps/\' . $apps_element[\'id\'];
              update_field( \'field_550c63cc17698\', $public_app_url, $post_id );

              // update app market ID
              update_field( \'field_55dcf06582888\', $apps_element[\'id\'], $post_id);

              if ( !empty($available_subscription_elements) ) {
                // update available subscriptions
                $subscription_field_key = "field_55dd0bbdccfe6";
                $subscription_value = get_field($subscription_field_key, $post_id);

                foreach ( $available_subscription_elements as $available_subscription_element ) {
                  $country_specific_available_subscriptions = $available_subscription_element[\'subscriptionCountries\'][\'elements\'];

                  foreach ( $country_specific_available_subscriptions as $country_specific_available_subscription ) {
                      $subscription_value[] = array(\'field_55dd0beaccfe7\' => $country_specific_available_subscription[\'id\'], \'field_55dd0c1bccfe8\' => $country_specific_available_subscription[\'name\'], \'field_55dd0d6fccfe9\' => $country_specific_available_subscription[\'amount\']);
                    }
                }
                update_field( $subscription_field_key, $subscription_value, $post_id );
              }

              if (!empty($available_metered_elements)) {
                // update available metered
                $metered_field_key = "field_55e4f6eda039f";
                $metered_value = get_field($metered_field_key, $post_id);

                foreach ( $available_metered_elements as $available_metered_element ) {
                  $country_specific_available_metered_tiers = $available_metered_element[\'meteredCountries\'][\'elements\'];

                  foreach ( $country_specific_available_metered_tiers as $country_specific_available_metered_tier ) {
                      $metered_value[] = array(\'field_55e4f6eda03a0\' => $country_specific_available_metered_tier[\'id\'], \'field_55e4f6eda03a1\' => $country_specific_available_metered_tier[\'action\'], \'field_55e4f6eda03a2\' => $country_specific_available_metered_tier[\'amount\']);
                    }
                }
                update_field( $metered_field_key, $metered_value, $post_id );
              }

          endif;

          // Reset Post Data
          wp_reset_postdata();
        }

      }

      // delete all \'app\' posts that don\'t have a matching app ID


    }



    register_deactivation_hook(__FILE__, \'cb_cron_jobs_deactivation\');

    function cb_cron_jobs_deactivation() {
      wp_clear_scheduled_hook(\'my_hourly_event\');
    }

    ?>

1 个回复
SO网友:christiancbergstrom

禁用所有插件,并仅重新启用此插件正确运行所需的插件(自定义帖子类型和自定义分类插件)。重新激活插件并收到错误消息,但详细信息是第128行中有分号。由于这是一个用来获取数组中元素ID的函数,因此它后面应该跟一个, 而不是;. 更改了此选项,并成功激活了插件。

故事的寓意:尝试停用可能会干扰错误显示的插件&;如果错误显示清晰显示。

相关推荐

创建帖子,包含来自远程API的数据

我需要一些帮助和指导。因此,我正在开发一个网站(自定义主题),目标是从远程API获取数据。我希望能够将数据存储在各个帖子中(一种自定义帖子类型),当有人向远程API添加或删除数据时,它应该会更新网站上的帖子。我使用的API的结构如下:https://pippinsplugins.com/edd-api/products我知道如何从中获取数据并解码JSON等。$url = \'https://pippinsplugins.com/edd-api/products\'; $username