2011-09-08 04:10:56 +00:00
< ? php
/**
* Name : WordPress Post Connector
2012-01-27 01:12:10 +00:00
* Description : Post to WordPress ( or anything else which uses blogger XMLRPC API )
2017-01-24 20:07:44 +00:00
* Version : 1.1
2011-09-08 04:10:56 +00:00
* Author : Mike Macgirvin < http :// macgirvin . com / profile / mike >
*/
2018-03-07 21:48:34 +00:00
2018-01-27 01:04:00 +00:00
use Friendica\Content\Text\BBCode ;
2018-03-07 21:48:34 +00:00
use Friendica\Content\Text\HTML ;
2018-01-17 00:51:12 +00:00
use Friendica\Core\Addon ;
2018-01-22 19:03:11 +00:00
use Friendica\Core\L10n ;
2018-10-29 23:40:18 +00:00
use Friendica\Core\Logger ;
2017-11-06 23:55:24 +00:00
use Friendica\Core\PConfig ;
2018-07-20 12:20:48 +00:00
use Friendica\Database\DBA ;
2018-01-28 14:01:09 +00:00
use Friendica\Util\Network ;
2017-11-06 23:55:24 +00:00
2011-09-08 04:10:56 +00:00
function wppost_install () {
2018-01-17 00:51:12 +00:00
Addon :: registerHook ( 'post_local' , 'addon/wppost/wppost.php' , 'wppost_post_local' );
Addon :: registerHook ( 'notifier_normal' , 'addon/wppost/wppost.php' , 'wppost_send' );
Addon :: registerHook ( 'jot_networks' , 'addon/wppost/wppost.php' , 'wppost_jot_nets' );
Addon :: registerHook ( 'connector_settings' , 'addon/wppost/wppost.php' , 'wppost_settings' );
Addon :: registerHook ( 'connector_settings_post' , 'addon/wppost/wppost.php' , 'wppost_settings_post' );
2011-09-08 04:10:56 +00:00
}
function wppost_uninstall () {
2018-01-17 00:51:12 +00:00
Addon :: unregisterHook ( 'post_local' , 'addon/wppost/wppost.php' , 'wppost_post_local' );
Addon :: unregisterHook ( 'notifier_normal' , 'addon/wppost/wppost.php' , 'wppost_send' );
Addon :: unregisterHook ( 'jot_networks' , 'addon/wppost/wppost.php' , 'wppost_jot_nets' );
Addon :: unregisterHook ( 'connector_settings' , 'addon/wppost/wppost.php' , 'wppost_settings' );
Addon :: unregisterHook ( 'connector_settings_post' , 'addon/wppost/wppost.php' , 'wppost_settings_post' );
2011-10-12 01:46:33 +00:00
// obsolete - remove
2018-01-17 00:51:12 +00:00
Addon :: unregisterHook ( 'post_local_end' , 'addon/wppost/wppost.php' , 'wppost_send' );
2018-01-20 13:57:41 +00:00
Addon :: unregisterHook ( 'addon_settings' , 'addon/wppost/wppost.php' , 'wppost_settings' );
Addon :: unregisterHook ( 'addon_settings_post' , 'addon/wppost/wppost.php' , 'wppost_settings_post' );
2011-10-12 01:46:33 +00:00
2011-09-08 04:10:56 +00:00
}
function wppost_jot_nets ( & $a , & $b ) {
if ( ! local_user ())
return ;
2017-11-06 23:55:24 +00:00
$wp_post = PConfig :: get ( local_user (), 'wppost' , 'post' );
2011-09-08 04:10:56 +00:00
if ( intval ( $wp_post ) == 1 ) {
2017-11-06 23:55:24 +00:00
$wp_defpost = PConfig :: get ( local_user (), 'wppost' , 'post_by_default' );
2011-09-08 04:10:56 +00:00
$selected = (( intval ( $wp_defpost ) == 1 ) ? ' checked="checked" ' : '' );
2012-02-21 23:08:51 +00:00
$b .= '<div class="profile-jot-net"><input type="checkbox" name="wppost_enable" ' . $selected . ' value="1" /> '
2018-01-22 19:03:11 +00:00
. L10n :: t ( 'Post to Wordpress' ) . '</div>' ;
2011-09-08 04:10:56 +00:00
}
}
function wppost_settings ( & $a , & $s ) {
2014-05-29 10:42:25 +00:00
if ( ! local_user ())
return ;
2011-09-08 04:10:56 +00:00
2014-05-29 10:42:25 +00:00
/* Add our stylesheet to the page so we can make our settings look nice */
2011-09-08 04:10:56 +00:00
2018-10-09 18:13:22 +00:00
$a -> page [ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . $a -> getBaseURL () . '/addon/wppost/wppost.css' . '" media="all" />' . " \r \n " ;
2011-09-08 04:10:56 +00:00
2014-05-29 10:42:25 +00:00
/* Get the current state of our config variables */
2011-09-08 04:10:56 +00:00
2017-11-06 23:55:24 +00:00
$enabled = PConfig :: get ( local_user (), 'wppost' , 'post' );
2014-05-29 10:42:25 +00:00
$checked = (( $enabled ) ? ' checked="checked" ' : '' );
2011-09-08 04:10:56 +00:00
2014-05-29 10:42:25 +00:00
$css = (( $enabled ) ? '' : '-disabled' );
2014-04-24 14:18:36 +00:00
2017-11-06 23:55:24 +00:00
$def_enabled = PConfig :: get ( local_user (), 'wppost' , 'post_by_default' );
$back_enabled = PConfig :: get ( local_user (), 'wppost' , 'backlink' );
$shortcheck_enabled = PConfig :: get ( local_user (), 'wppost' , 'shortcheck' );
2011-09-08 04:10:56 +00:00
2014-05-29 10:42:25 +00:00
$def_checked = (( $def_enabled ) ? ' checked="checked" ' : '' );
$back_checked = (( $back_enabled ) ? ' checked="checked" ' : '' );
$shortcheck_checked = (( $shortcheck_enabled ) ? ' checked="checked" ' : '' );
2011-09-08 04:10:56 +00:00
2017-11-06 23:55:24 +00:00
$wp_username = PConfig :: get ( local_user (), 'wppost' , 'wp_username' );
$wp_password = PConfig :: get ( local_user (), 'wppost' , 'wp_password' );
$wp_blog = PConfig :: get ( local_user (), 'wppost' , 'wp_blog' );
$wp_backlink_text = PConfig :: get ( local_user (), 'wppost' , 'wp_backlink_text' );
2011-09-08 04:10:56 +00:00
/* Add some HTML to the existing form */
2013-11-30 20:27:39 +00:00
$s .= '<span id="settings_wppost_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_wppost_expanded\'); openClose(\'settings_wppost_inflated\');">' ;
2018-01-22 19:03:11 +00:00
$s .= '<img class="connector' . $css . '" src="images/wordpress.png" /><h3 class="connector">' . L10n :: t ( 'Wordpress Export' ) . '</h3>' ;
2013-11-30 20:27:39 +00:00
$s .= '</span>' ;
$s .= '<div id="settings_wppost_expanded" class="settings-block" style="display: none;">' ;
$s .= '<span class="fakelink" onclick="openClose(\'settings_wppost_expanded\'); openClose(\'settings_wppost_inflated\');">' ;
2018-01-22 19:03:11 +00:00
$s .= '<img class="connector' . $css . '" src="images/wordpress.png" /><h3 class="connector">' . L10n :: t ( 'Wordpress Export' ) . '</h3>' ;
2013-11-30 20:27:39 +00:00
$s .= '</span>' ;
2011-09-08 04:10:56 +00:00
$s .= '<div id="wppost-enable-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-enable-label" for="wppost-checkbox">' . L10n :: t ( 'Enable WordPress Post Addon' ) . '</label>' ;
2011-09-08 04:10:56 +00:00
$s .= '<input id="wppost-checkbox" type="checkbox" name="wppost" value="1" ' . $checked . '/>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="wppost-username-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-username-label" for="wppost-username">' . L10n :: t ( 'WordPress username' ) . '</label>' ;
2011-09-08 04:10:56 +00:00
$s .= '<input id="wppost-username" type="text" name="wp_username" value="' . $wp_username . '" />' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="wppost-password-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-password-label" for="wppost-password">' . L10n :: t ( 'WordPress password' ) . '</label>' ;
2011-09-08 04:10:56 +00:00
$s .= '<input id="wppost-password" type="password" name="wp_password" value="' . $wp_password . '" />' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="wppost-blog-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-blog-label" for="wppost-blog">' . L10n :: t ( 'WordPress API URL' ) . '</label>' ;
2011-09-08 04:10:56 +00:00
$s .= '<input id="wppost-blog" type="text" name="wp_blog" value="' . $wp_blog . '" />' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="wppost-bydefault-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-bydefault-label" for="wppost-bydefault">' . L10n :: t ( 'Post to WordPress by default' ) . '</label>' ;
2011-09-08 04:10:56 +00:00
$s .= '<input id="wppost-bydefault" type="checkbox" name="wp_bydefault" value="1" ' . $def_checked . '/>' ;
2012-06-07 05:27:35 +00:00
$s .= '</div><div class="clear"></div>' ;
2012-05-14 23:30:18 +00:00
$s .= '<div id="wppost-backlink-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-backlink-label" for="wppost-backlink">' . L10n :: t ( 'Provide a backlink to the Friendica post' ) . '</label>' ;
2012-05-15 11:31:38 +00:00
$s .= '<input id="wppost-backlink" type="checkbox" name="wp_backlink" value="1" ' . $back_checked . '/>' ;
2014-05-29 10:42:25 +00:00
$s .= '</div><div class="clear"></div>' ;
2017-01-24 20:07:44 +00:00
$s .= '<div id="wppost-backlinktext-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-backlinktext-label" for="wp_backlink_text">' . L10n :: t ( 'Text for the backlink, e.g. Read the original post and comment stream on Friendica.' ) . '</label>' ;
2017-01-24 20:07:44 +00:00
$s .= '<input id="wppost-backlinktext" type="text" name="wp_backlink_text" value="' . $wp_backlink_text . '" ' . $wp_backlink_text . '/>' ;
$s .= '</div><div class="clear"></div>' ;
2012-05-14 23:30:18 +00:00
2014-05-29 10:42:25 +00:00
$s .= '<div id="wppost-shortcheck-wrapper">' ;
2018-01-22 19:03:11 +00:00
$s .= '<label id="wppost-shortcheck-label" for="wppost-shortcheck">' . L10n :: t ( " Don't post messages that are too short " ) . '</label>' ;
2014-05-29 10:42:25 +00:00
$s .= '<input id="wppost-shortcheck" type="checkbox" name="wp_shortcheck" value="1" ' . $shortcheck_checked . '/>' ;
2011-09-08 04:10:56 +00:00
$s .= '</div><div class="clear"></div>' ;
/* provide a submit button */
2018-01-22 19:03:11 +00:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="wppost-submit" name="wppost-submit" class="settings-submit" value="' . L10n :: t ( 'Save Settings' ) . '" /></div></div>' ;
2011-09-08 04:10:56 +00:00
}
function wppost_settings_post ( & $a , & $b ) {
if ( x ( $_POST , 'wppost-submit' )) {
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), 'wppost' , 'post' , intval ( $_POST [ 'wppost' ]));
PConfig :: set ( local_user (), 'wppost' , 'post_by_default' , intval ( $_POST [ 'wp_bydefault' ]));
PConfig :: set ( local_user (), 'wppost' , 'wp_username' , trim ( $_POST [ 'wp_username' ]));
PConfig :: set ( local_user (), 'wppost' , 'wp_password' , trim ( $_POST [ 'wp_password' ]));
PConfig :: set ( local_user (), 'wppost' , 'wp_blog' , trim ( $_POST [ 'wp_blog' ]));
PConfig :: set ( local_user (), 'wppost' , 'backlink' , trim ( $_POST [ 'wp_backlink' ]));
PConfig :: set ( local_user (), 'wppost' , 'shortcheck' , trim ( $_POST [ 'wp_shortcheck' ]));
2017-01-24 20:07:44 +00:00
$wp_backlink_text = notags ( trim ( $_POST [ 'wp_backlink_text' ]));
2018-02-15 02:43:40 +00:00
$wp_backlink_text = BBCode :: convert ( $wp_backlink_text , false , 8 );
2018-03-07 21:48:34 +00:00
$wp_backlink_text = HTML :: toPlaintext ( $wp_backlink_text , 0 , true );
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), 'wppost' , 'wp_backlink_text' , $wp_backlink_text );
2011-09-08 04:10:56 +00:00
}
}
2017-09-06 16:16:33 +00:00
function wppost_post_local ( & $a , & $b ) {
2011-09-08 04:10:56 +00:00
2011-10-12 01:46:33 +00:00
// This can probably be changed to allow editing by pointing to a different API endpoint
2011-09-08 04:10:56 +00:00
2017-09-06 16:16:33 +00:00
if ( $b [ 'edit' ]) {
2011-09-08 04:10:56 +00:00
return ;
2017-01-24 20:07:44 +00:00
}
2011-09-08 04:10:56 +00:00
2017-09-06 16:16:33 +00:00
if ( ! local_user () || ( local_user () != $b [ 'uid' ])) {
2011-09-08 04:10:56 +00:00
return ;
2017-01-24 20:07:44 +00:00
}
2011-09-08 04:10:56 +00:00
2017-09-06 16:16:33 +00:00
if ( $b [ 'private' ] || $b [ 'parent' ]) {
2011-09-08 04:10:56 +00:00
return ;
2017-01-24 20:07:44 +00:00
}
2011-09-08 04:10:56 +00:00
2017-11-06 23:55:24 +00:00
$wp_post = intval ( PConfig :: get ( local_user (), 'wppost' , 'post' ));
2011-09-08 04:10:56 +00:00
2011-11-07 22:25:11 +00:00
$wp_enable = (( $wp_post && x ( $_REQUEST , 'wppost_enable' )) ? intval ( $_REQUEST [ 'wppost_enable' ]) : 0 );
2011-09-08 04:10:56 +00:00
2017-11-06 23:55:24 +00:00
if ( $b [ 'api_source' ] && intval ( PConfig :: get ( local_user (), 'wppost' , 'post_by_default' ))) {
2011-09-08 04:10:56 +00:00
$wp_enable = 1 ;
2017-01-24 20:07:44 +00:00
}
2011-09-08 04:10:56 +00:00
2017-09-06 16:16:33 +00:00
if ( ! $wp_enable ) {
return ;
}
2011-10-12 01:46:33 +00:00
2017-09-06 16:16:33 +00:00
if ( strlen ( $b [ 'postopts' ])) {
$b [ 'postopts' ] .= ',' ;
}
$b [ 'postopts' ] .= 'wppost' ;
2011-10-12 01:46:33 +00:00
}
function wppost_send ( & $a , & $b ) {
2018-01-10 03:27:40 +00:00
if ( $b [ 'deleted' ] || $b [ 'private' ] || ( $b [ 'created' ] !== $b [ 'edited' ])) {
2014-05-29 10:42:25 +00:00
return ;
2018-01-10 03:27:40 +00:00
}
2011-10-12 01:46:33 +00:00
2018-01-10 03:27:40 +00:00
if ( ! strstr ( $b [ 'postopts' ], 'wppost' )) {
2014-05-29 10:42:25 +00:00
return ;
2018-01-10 03:27:40 +00:00
}
2011-10-12 01:46:33 +00:00
2018-01-10 03:27:40 +00:00
if ( $b [ 'parent' ] != $b [ 'id' ]) {
2014-05-29 10:42:25 +00:00
return ;
2018-01-10 03:27:40 +00:00
}
2011-10-12 01:46:33 +00:00
2017-11-25 23:56:18 +00:00
// Dont't post if the post doesn't belong to us.
// This is a check for forum postings
2018-07-20 12:20:48 +00:00
$self = DBA :: selectFirst ( 'contact' , [ 'id' ], [ 'uid' => $b [ 'uid' ], 'self' => true ]);
2017-11-25 23:56:18 +00:00
if ( $b [ 'contact-id' ] != $self [ 'id' ]) {
return ;
}
2011-10-12 01:46:33 +00:00
2017-11-06 23:55:24 +00:00
$wp_username = xmlify ( PConfig :: get ( $b [ 'uid' ], 'wppost' , 'wp_username' ));
$wp_password = xmlify ( PConfig :: get ( $b [ 'uid' ], 'wppost' , 'wp_password' ));
$wp_blog = PConfig :: get ( $b [ 'uid' ], 'wppost' , 'wp_blog' );
$wp_backlink_text = PConfig :: get ( $b [ 'uid' ], 'wppost' , 'wp_backlink_text' );
2017-01-24 20:07:44 +00:00
if ( $wp_backlink_text == '' ) {
2018-01-22 19:03:11 +00:00
$wp_backlink_text = L10n :: t ( 'Read the orig i nal post and com ment stream on Friendica' );
2017-01-24 20:07:44 +00:00
}
2011-10-12 01:46:33 +00:00
2018-01-27 00:26:37 +00:00
if ( $wp_username && $wp_password && $wp_blog ) {
2012-06-17 23:30:44 +00:00
$wptitle = trim ( $b [ 'title' ]);
2018-01-27 00:26:37 +00:00
if ( intval ( PConfig :: get ( $b [ 'uid' ], 'wppost' , 'shortcheck' ))) {
2014-05-29 10:42:25 +00:00
// Checking, if its a post that is worth a blog post
$postentry = false ;
2018-01-27 01:04:00 +00:00
$siteinfo = BBCode :: getAttachedData ( $b [ " body " ]);
2014-05-29 10:42:25 +00:00
// Is it a link to an aricle, a video or a photo?
2017-01-24 20:07:44 +00:00
if ( isset ( $siteinfo [ " type " ])) {
2018-01-15 13:15:33 +00:00
if ( in_array ( $siteinfo [ " type " ], [ " link " , " audio " , " video " , " photo " ])) {
2014-05-29 10:42:25 +00:00
$postentry = true ;
2017-01-24 20:07:44 +00:00
}
}
2014-05-29 10:42:25 +00:00
// Does it have a title?
2017-01-24 20:07:44 +00:00
if ( $wptitle != " " ) {
2014-05-29 10:42:25 +00:00
$postentry = true ;
2017-01-24 20:07:44 +00:00
}
2014-05-29 10:42:25 +00:00
// Is it larger than 500 characters?
2017-01-24 20:07:44 +00:00
if ( strlen ( $b [ 'body' ]) > 500 ) {
2014-05-29 10:42:25 +00:00
$postentry = true ;
2017-01-24 20:07:44 +00:00
}
2014-05-29 10:42:25 +00:00
2017-01-24 20:07:44 +00:00
if ( ! $postentry ) {
2014-05-29 10:42:25 +00:00
return ;
2017-01-24 20:07:44 +00:00
}
2014-05-29 10:42:25 +00:00
}
2012-04-01 17:20:40 +00:00
// If the title is empty then try to guess
2012-06-17 23:30:44 +00:00
if ( $wptitle == '' ) {
2016-06-23 18:25:00 +00:00
// Fetch information about the post
2018-01-27 01:04:00 +00:00
$siteinfo = BBCode :: getAttachedData ( $b [ " body " ]);
2017-01-24 20:07:44 +00:00
if ( isset ( $siteinfo [ " title " ])) {
2016-06-23 18:25:00 +00:00
$wptitle = $siteinfo [ " title " ];
2017-01-24 20:07:44 +00:00
}
2012-04-01 17:20:40 +00:00
// If no bookmark is found then take the first line
2012-06-17 23:30:44 +00:00
if ( $wptitle == '' ) {
2014-01-26 08:53:12 +00:00
// Remove the share element before fetching the first line
$title = trim ( preg_replace ( " / \ [share.*? \ ](.*?) \ [ \ /share \ ]/ism " , " \n $ 1 \n " , $b [ 'body' ]));
2018-03-07 21:48:34 +00:00
$title = HTML :: toPlaintext ( BBCode :: convert ( $title , false ), 0 , true ) . " \n " ;
2012-04-01 17:20:40 +00:00
$pos = strpos ( $title , " \n " );
2013-07-14 12:58:12 +00:00
$trailer = " " ;
2017-06-09 01:20:27 +00:00
if (( $pos == 0 ) || ( $pos > 100 )) {
2013-07-14 12:58:12 +00:00
$pos = 100 ;
$trailer = " ... " ;
}
2012-04-01 17:20:40 +00:00
2013-07-14 12:58:12 +00:00
$wptitle = substr ( $title , 0 , $pos ) . $trailer ;
2012-04-01 17:20:40 +00:00
}
}
2011-09-08 04:33:54 +00:00
2018-01-22 19:03:11 +00:00
$title = '<title>' . (( $wptitle ) ? $wptitle : L10n :: t ( 'Post from Friendica' )) . '</title>' ;
2018-02-15 02:43:40 +00:00
$post = BBCode :: convert ( $b [ 'body' ], false , 4 );
2013-07-20 12:28:17 +00:00
// If a link goes to youtube then remove the stuff around it. Wordpress detects youtube links and embeds it
$post = preg_replace ( '/<a.*?href="(https?:\/\/www.youtube.com\/.*?)".*?>(.*?)<\/a>/ism' , " \n $ 1 \n " , $post );
$post = preg_replace ( '/<a.*?href="(https?:\/\/youtu.be\/.*?)".*?>(.*?)<\/a>/ism' , " \n $ 1 \n " , $post );
$post = $title . $post ;
2012-05-14 23:30:18 +00:00
2017-11-06 23:55:24 +00:00
$wp_backlink = intval ( PConfig :: get ( $b [ 'uid' ], 'wppost' , 'backlink' ));
2017-01-24 20:07:44 +00:00
if ( $wp_backlink && $b [ 'plink' ]) {
2013-07-20 12:28:17 +00:00
$post .= EOL . EOL . '<a href="' . $b [ 'plink' ] . '">'
2017-01-24 20:07:44 +00:00
. $wp_backlink_text . '</a>' . EOL . EOL ;
}
2012-05-14 23:30:18 +00:00
2011-11-13 23:49:19 +00:00
$post = xmlify ( $post );
2011-09-08 04:10:56 +00:00
2012-05-14 23:30:18 +00:00
2011-09-08 04:10:56 +00:00
$xml = <<< EOT
2012-02-28 07:19:25 +00:00
< ? xml version = \ " 1.0 \" encoding= \" utf-8 \" ?>
2011-09-08 04:10:56 +00:00
< methodCall >
< methodName > blogger . newPost </ methodName >
< params >
< param >< value >< string /></ value ></ param >
< param >< value >< string /></ value ></ param >
< param >< value >< string > $wp_username </ string ></ value ></ param >
< param >< value >< string > $wp_password </ string ></ value ></ param >
< param >< value >< string > $post </ string ></ value ></ param >
< param >< value >< int > 1 </ int ></ value ></ param >
</ params >
</ methodCall >
EOT ;
2018-10-29 23:40:18 +00:00
Logger :: log ( 'wppost: data: ' . $xml , LOGGER_DATA );
2011-09-08 04:10:56 +00:00
2018-01-27 13:52:02 +00:00
if ( $wp_blog !== 'test' ) {
2018-10-11 05:40:57 +00:00
$x = Network :: post ( $wp_blog , $xml ) -> getBody ();
2017-01-24 20:07:44 +00:00
}
2018-10-29 23:40:18 +00:00
Logger :: log ( 'posted to wordpress: ' . (( $x ) ? $x : '' ), LOGGER_DEBUG );
2011-09-08 04:10:56 +00:00
}
}