最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

plugins - Adapt PHP form action for WordPress?

programmeradmin0浏览0评论

I have a PHP form that I'd like to adapt for WordPress. I went through and made a plugin that creates a widget and a form. The form action goes to a file I created called listrak-newsletter-api.php but when I submit to it in the below form, I get a 404 error.

These files are all located in my /wp-content/plugins/listrak-newsletter-api directory.

Stand alone, outside of WordPress, this works great. But since migrating it into WordPress, it's becoming quite convoluted. I used to have a simple HTML page with a form that had a form action to listrak-newsletter-api.php and that worked great. But taking this into WordPress seems to have made it a little more difficult than it should be.

Now, I want to keep it as a widget because I'm able to place the widget where I want, on the sidebar, of the WordPress theme. Where it shows up and how it shows up when I activate it are great. Functionality just needs to work.

This file is /wp-content/plugins/listrak-newsletter-api/plugin.php :

<?php

/**
* Plugin Name: Listrak Newsletter API
* Description: Newsletter integration with Listrak.
* Version: 1.0
*/

// Register and load the widget
function wpb_load_widget()
{
    register_widget('wpb_widget');
}
add_action('widgets_init', 'wpb_load_widget');

// Creating the widget 
class wpb_widget extends WP_Widget
{

    function __construct()
    {
        parent::__construct(
        // Base ID of your widget
            'wpb_widget', 
        // Widget name will appear in UI
            __('WPBeginner Widget', 'wpb_widget_domain'), 
        // Widget description
            array(
            'description' => __('Sample widget based on WPBeginner Tutorial', 'wpb_widget_domain')
        ));
    }

    // Creating widget front-end

    public function widget($args, $instance)
    {
        $title = apply_filters('widget_title', $instance['title']);

        // before and after widget arguments are defined by themes
        echo $args['before_widget'];        

        // This is where you run the code and display the output
        echo '<div class="block-title"><span>EMAIL NEWSLETTER</span></div>';
        echo '<form action="/wp-content/plugins/listrak-newsletter-api.php" method="post">';
        echo '  <div class="tnp-field tnp-field-email"><label>Email</label>';
        echo '  <input class="email" name="email" required="" type="email"></div>';     
        echo '  <div class="tnp-field tnp-field-button"><input class="tnp-submit" value="Subscribe now!" type="submit"></div>';
        echo '</form>';
        echo $args['after_widget'];
    }

    // Widget Backend 
    public function form($instance)
    {
        if (isset($instance['title'])) {
            $title = $instance['title'];
        } else {
            $title = __('New title', 'wpb_widget_domain');
        }
        // Widget admin form
        ?>
        <p>
        <label for="<?php
                echo $this->get_field_id('title');
        ?>"><?php
                _e('Title:');
        ?></label> 
        <input class="widefat" id="<?php
                echo $this->get_field_id('title');
        ?>" name="<?php
                echo $this->get_field_name('title');
        ?>" type="text" value="<?php
                echo esc_attr($title);
        ?>" />
        </p>
        <?php
    }

    // Updating widget replacing old instances with new
    public function update($new_instance, $old_instance)
    {
        $instance          = array();
        $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
        return $instance;
    }
} // Class wpb_widget ends here

?>

This file is /wp-content/plugins/listrak-newsletter-api/listrak-newsletter-api.php :

<?php

$host = $_SERVER['HTTP_HOST'];

if (isset($_POST['action'])) {

    $email = $_POST['email']; //obtain email from post, place into $email variable
    $email = filter_var($email, FILTER_SANITIZE_EMAIL); //sanitizing email
    //$theAction = $_POST['action'];
    //wpSubscription($host, $email, $theAction);
    //$redirect = $_POST['redirect'];
    //header('Location: ' . $redirect);    

    if ($_POST['email'] == '') {
        echo "Please enter an email address";
    }
    if ($host == network_site_url()) {
        $sh_param   = array( //setting username & password array
            'UserName' => "",
            'Password' => ""
        );
        $authvalues = new SoapVar($sh_param, SOAP_ENC_OBJECT); //encoding username and password array
        $headers[]  = new SoapHeader("/", 'WSUser', $sh_param);
        $soapClient = new SoapClient(".asmx?WSDL", array(
            'trace' => 1,
            'exceptions' => true,
            'cache_wsdl' => WSDL_CACHE_NONE,
            'soap_version' => SOAP_1_2
        ));

        $soapClient->__setSoapHeaders($headers);
        $params = array( //parameters for soap xml integration with listrak
            'WSContact' => array(
                'EmailAddress' => $email,
                'ListID' => ''
            ),
            'ProfileUpdateType' => 'Overwrite',
            'ExternalEventIDs' => '',
            'OverrideUnsubscribe' => true
        );

        try {

            $rest = $soapClient->SetContact($params); //using SetContact method, send parameters

        }
        catch (SoapFault $e) { //if an error occurs, display it

            echo '<pre>';

            print($e->getMessage());

            echo '</pre>';
        }
    }
}
?>

I have a PHP form that I'd like to adapt for WordPress. I went through and made a plugin that creates a widget and a form. The form action goes to a file I created called listrak-newsletter-api.php but when I submit to it in the below form, I get a 404 error.

These files are all located in my /wp-content/plugins/listrak-newsletter-api directory.

Stand alone, outside of WordPress, this works great. But since migrating it into WordPress, it's becoming quite convoluted. I used to have a simple HTML page with a form that had a form action to listrak-newsletter-api.php and that worked great. But taking this into WordPress seems to have made it a little more difficult than it should be.

Now, I want to keep it as a widget because I'm able to place the widget where I want, on the sidebar, of the WordPress theme. Where it shows up and how it shows up when I activate it are great. Functionality just needs to work.

This file is /wp-content/plugins/listrak-newsletter-api/plugin.php :

<?php

/**
* Plugin Name: Listrak Newsletter API
* Description: Newsletter integration with Listrak.
* Version: 1.0
*/

// Register and load the widget
function wpb_load_widget()
{
    register_widget('wpb_widget');
}
add_action('widgets_init', 'wpb_load_widget');

// Creating the widget 
class wpb_widget extends WP_Widget
{

    function __construct()
    {
        parent::__construct(
        // Base ID of your widget
            'wpb_widget', 
        // Widget name will appear in UI
            __('WPBeginner Widget', 'wpb_widget_domain'), 
        // Widget description
            array(
            'description' => __('Sample widget based on WPBeginner Tutorial', 'wpb_widget_domain')
        ));
    }

    // Creating widget front-end

    public function widget($args, $instance)
    {
        $title = apply_filters('widget_title', $instance['title']);

        // before and after widget arguments are defined by themes
        echo $args['before_widget'];        

        // This is where you run the code and display the output
        echo '<div class="block-title"><span>EMAIL NEWSLETTER</span></div>';
        echo '<form action="/wp-content/plugins/listrak-newsletter-api.php" method="post">';
        echo '  <div class="tnp-field tnp-field-email"><label>Email</label>';
        echo '  <input class="email" name="email" required="" type="email"></div>';     
        echo '  <div class="tnp-field tnp-field-button"><input class="tnp-submit" value="Subscribe now!" type="submit"></div>';
        echo '</form>';
        echo $args['after_widget'];
    }

    // Widget Backend 
    public function form($instance)
    {
        if (isset($instance['title'])) {
            $title = $instance['title'];
        } else {
            $title = __('New title', 'wpb_widget_domain');
        }
        // Widget admin form
        ?>
        <p>
        <label for="<?php
                echo $this->get_field_id('title');
        ?>"><?php
                _e('Title:');
        ?></label> 
        <input class="widefat" id="<?php
                echo $this->get_field_id('title');
        ?>" name="<?php
                echo $this->get_field_name('title');
        ?>" type="text" value="<?php
                echo esc_attr($title);
        ?>" />
        </p>
        <?php
    }

    // Updating widget replacing old instances with new
    public function update($new_instance, $old_instance)
    {
        $instance          = array();
        $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
        return $instance;
    }
} // Class wpb_widget ends here

?>

This file is /wp-content/plugins/listrak-newsletter-api/listrak-newsletter-api.php :

<?php

$host = $_SERVER['HTTP_HOST'];

if (isset($_POST['action'])) {

    $email = $_POST['email']; //obtain email from post, place into $email variable
    $email = filter_var($email, FILTER_SANITIZE_EMAIL); //sanitizing email
    //$theAction = $_POST['action'];
    //wpSubscription($host, $email, $theAction);
    //$redirect = $_POST['redirect'];
    //header('Location: ' . $redirect);    

    if ($_POST['email'] == '') {
        echo "Please enter an email address";
    }
    if ($host == network_site_url()) {
        $sh_param   = array( //setting username & password array
            'UserName' => "",
            'Password' => ""
        );
        $authvalues = new SoapVar($sh_param, SOAP_ENC_OBJECT); //encoding username and password array
        $headers[]  = new SoapHeader("http://webservices.listrak/v31/", 'WSUser', $sh_param);
        $soapClient = new SoapClient("https://webservices.listrak/v31/IntegrationService.asmx?WSDL", array(
            'trace' => 1,
            'exceptions' => true,
            'cache_wsdl' => WSDL_CACHE_NONE,
            'soap_version' => SOAP_1_2
        ));

        $soapClient->__setSoapHeaders($headers);
        $params = array( //parameters for soap xml integration with listrak
            'WSContact' => array(
                'EmailAddress' => $email,
                'ListID' => ''
            ),
            'ProfileUpdateType' => 'Overwrite',
            'ExternalEventIDs' => '',
            'OverrideUnsubscribe' => true
        );

        try {

            $rest = $soapClient->SetContact($params); //using SetContact method, send parameters

        }
        catch (SoapFault $e) { //if an error occurs, display it

            echo '<pre>';

            print($e->getMessage());

            echo '</pre>';
        }
    }
}
?>
Share Improve this question asked Nov 9, 2017 at 6:26 JamesJames 1133 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

I think your action URL is wrong. Did you try with

<?php echo plugins_url( 'listrak-newsletter-api.php', __FILE__ ); ?>

like this way:

echo '<form action="' . plugins_url( 'listrak-newsletter-api.php', __FILE__ ) . '" method="post">';

in your code?

Anyway I still recommend you to use WP AJAX to do this. Read here for more information.

发布评论

评论列表(0)

  1. 暂无评论